Решение на Ретроспекция от Георги Ангелов

Обратно към всички решения

Към профила на Георги Ангелов

Резултати

  • 0 точки от тестове
  • 5 бонус точки
  • 5 точки общо
  • 0 успешни тест(а)
  • 0 неуспешни тест(а)

Код

REPOSITORY = 'https://github.com/stormbreakerbg/python-retrospective'
##############################################################################
# По-малко от двадесет неща, които научих
##############################################################################
#
# 1. range е по-ясно как и защо се използва отколкото просто някакви числа в
# тюпъли.
#
#####
#
# 2. Светът не е идеален. В задачата за хороскопа SIGNS щеше да е по-добре да
# е dict (става още по-ясно кое защо е), но се налага 'Козирог' да го има
# два пъти.
# Със сигурност има някой странен трик да се направи да работи с една поява
# на 'Козирог', но няма да е толкова изчистено и разбираемо от други хора.
#
#####
#
# 3. Използването на list/dict comprehensions не е толкова готино.
# В groupby е много по-изчистен варианта с цикъла, пък и върши по-малко
# работа като извиква func много по-малко пъти и проверява по-малко
# елементи. Варианта с comprehensionите въобще не изглежда разбираем.
#
#####
#
# 4. Използването на list/dict comprehensions е готино.
# ... когато са къси нещата и се налага прост map/filter/проверка
# на итеруеми.
#
#####
#
# 5. Използването на вградени функции е готино и пести код (стига да знаеш за
# тези функции).
# В комбинация с точка 4 се получават много по-кратки неща.
# Пример: кода на zip_with се смали до
# return [func(*line) for line in zip(*iterables)]
#
#####
#
# 6. Имплементирането на повече функционалност, отколкото е в условието на
# задача/домашно е безсмислено, освен ако не научиш нещо в процеса
# на писане.
# Съкратих 61 реда от Person като махнах нещата, които не се изискват от
# условието. Е, беше добро упражнение за гетъри и сетъри.
#
#####
#
# 7. Python не е C++, Java, C# или който и да е силно-типизиран ОО език.
# Няма как със 100% сигурност да се поддържа йерархията от Person-и в добър
# стейт. Ако някой иска може да я прецака все някак. Безсмислено е да
# пробвам да я правя "по-умна" в този случай.
# Имам чувството, че някаква йерархия от обекти Person във всеки един
# момент ще се срине. Странно ми е да няма никакви гаранции за
# енкапсулация.
#
#####
#
# 8. Използването на set вместо list не винаги е по-добрата идея. Понякога
# ти трябва наредбата, дори и да не го осъзнаваш на момента.
#
#####
#
# 9. set е готин начин за премахване на дубликати на елементи от итеруеми,
# но само ако си 100% сигурен, че не ти трябва наредбата. Искам OrderedSet!
#
#####
#
# 10.По-ясното решение почти винаги е по-доброто решение. В тази връзка
# пренаписах начина за търсене на решения в TicTacToeBoard.
# Първо списъка с печелещите линии (_WIN_LINES) е най-ясен като всяка е
# просто координатите на три полета. Защо го бях писал координати на едно
# поле + стъпка нямам идея.
#
#####
#
# 11.Усложняването на кода за сметка на малко съкращаване на една константа е
# самоубийство.
# Когато е подбран добре формата на константите много неща могат
# да се направят на 1 ред в кода. Или ако не на 1 ред, то поне много
# по-просто.
#
#####
#
# 12.Вътрешното представяне на информацията трябва да е възможно най-близко до
# външното. Да записвам ключовете в _game_board като (row, column), вместо
# просто като стринга, който се използва за достъп, е глупаво и ми създава
# много повече работа.
#
#####
#
# 13.Още не мога да разгранича ясно къде да използвам една долна черта и къде
# две. Мисля, че е хубаво колкото се може повече неща (от тези, които са
# детайли на имплементацията) да са с една.
#
#
#####
#
# 14.Котките са много готини
#
# _
# \`*-.
# ) _`-.
# . : `. .
# : _ ' \
# ; *` _. `*-._
# `-.-' `-.
# ; ` `.
# :. . \
# . \ . : .-' .
# ' `+.; ; ' :
# : ' | ; ;-.
# ; ' : :`-: _.`* ;
# [bug] .*' / .*' ; .*`- +' `*'
# `*-* `*-* `*-*'

История (1 версия и 2 коментара)

Георги обнови решението на 26.04.2013 10:53 (преди над 11 години)

+REPOSITORY = 'https://github.com/stormbreakerbg/python-retrospective'
+
+##############################################################################
+# По-малко от двадесет неща, които научих
+##############################################################################
+#
+# 1. range е по-ясно как и защо се използва отколкото просто някакви числа в
+# тюпъли.
+#
+#####
+#
+# 2. Светът не е идеален. В задачата за хороскопа SIGNS щеше да е по-добре да
+# е dict (става още по-ясно кое защо е), но се налага 'Козирог' да го има
+# два пъти.
+# Със сигурност има някой странен трик да се направи да работи с една поява
+# на 'Козирог', но няма да е толкова изчистено и разбираемо от други хора.
+#
+#####
+#
+# 3. Използването на list/dict comprehensions не е толкова готино.
+# В groupby е много по-изчистен варианта с цикъла, пък и върши по-малко
+# работа като извиква func много по-малко пъти и проверява по-малко
+# елементи. Варианта с comprehensionите въобще не изглежда разбираем.
+#
+#####
+#
+# 4. Използването на list/dict comprehensions е готино.
+# ... когато са къси нещата и се налага прост map/filter/проверка
+# на итеруеми.
+#
+#####
+#
+# 5. Използването на вградени функции е готино и пести код (стига да знаеш за
+# тези функции).
+# В комбинация с точка 4 се получават много по-кратки неща.
+# Пример: кода на zip_with се смали до
+# return [func(*line) for line in zip(*iterables)]
+#
+#####
+#
+# 6. Имплементирането на повече функционалност, отколкото е в условието на
+# задача/домашно е безсмислено, освен ако не научиш нещо в процеса
+# на писане.
+# Съкратих 61 реда от Person като махнах нещата, които не се изискват от
+# условието. Е, беше добро упражнение за гетъри и сетъри.
+#
+#####
+#
+# 7. Python не е C++, Java, C# или който и да е силно-типизиран ОО език.
+# Няма как със 100% сигурност да се поддържа йерархията от Person-и в добър
+# стейт. Ако някой иска може да я прецака все някак. Безсмислено е да
+# пробвам да я правя "по-умна" в този случай.
+# Имам чувството, че някаква йерархия от обекти Person във всеки един
+# момент ще се срине. Странно ми е да няма никакви гаранции за
+# енкапсулация.
+#
+#####
+#
+# 8. Използването на set вместо list не винаги е по-добрата идея. Понякога
+# ти трябва наредбата, дори и да не го осъзнаваш на момента.
+#
+#####
+#
+# 9. set е готин начин за премахване на дубликати на елементи от итеруеми,
+# но само ако си 100% сигурен, че не ти трябва наредбата. Искам OrderedSet!
+#
+#####
+#
+# 10.По-ясното решение почти винаги е по-доброто решение. В тази връзка
+# пренаписах начина за търсене на решения в TicTacToeBoard.
+# Първо списъка с печелещите линии (_WIN_LINES) е най-ясен като всяка е
+# просто координатите на три полета. Защо го бях писал координати на едно
+# поле + стъпка нямам идея.
+#
+#####
+#
+# 11.Усложняването на кода за сметка на малко съкращаване на една константа е
+# самоубийство.
+# Когато е подбран добре формата на константите много неща могат
+# да се направят на 1 ред в кода. Или ако не на 1 ред, то поне много
+# по-просто.
+#
+#####
+#
+# 12.Вътрешното представяне на информацията трябва да е възможно най-близко до
+# външното. Да записвам ключовете в _game_board като (row, column), вместо
+# просто като стринга, който се използва за достъп, е глупаво и ми създава
+# много повече работа.
+#
+#####
+#
+# 13.Още не мога да разгранича ясно къде да използвам една долна черта и къде
+# две. Мисля, че е хубаво колкото се може повече неща (от тези, които са
+# детайли на имплементацията) да са с една.
+#
+#
+#####
+#
+# 14.Котките са много готини
+#
+# _
+# \`*-.
+# ) _`-.
+# . : `. .
+# : _ ' \
+# ; *` _. `*-._
+# `-.-' `-.
+# ; ` `.
+# :. . \
+# . \ . : .-' .
+# ' `+.; ; ' :
+# : ' | ; ;-.
+# ; ' : :`-: _.`* ;
+# [bug] .*' / .*' ; .*`- +' `*'
+# `*-* `*-* `*-*'

С точка 3 съм тотално несъгласен, но съм склонен да приема, че е въпрос на лично мнение.

Относно точка 13: Може би не сме го обяснили добре. Ще се пробвам тук и пак на някоя от следващите лекции.

  • _my_sweet_method - е метод, който не е за използване извън текущия клас/модул. Някакъв не особено магически метод, който е там вероятно за избегване на повторения или нещо в този дух. Знаеш, че при from my_sweet_module import * това име няма да се импортне
  • __my_sweet_method от друга страна е с критична важност за функционирането на твоя клас/модул. Той става достъпен през _MySweetClass__my_sweet_method и ясно казваш, че ако някой го пипне заслужава камъни да летят по главата му. Ако правиш някакви безумни магии, ползваш тази идея.
  • my_sweet_method_ е най-нормално име, което просто overwrite-ва вградено нещо в езика. Знаеш, че class е запазена дума и не може да се използва като първи аргумент за класметод. В този случай, class_ е един страхотен избор.
  • __my_sweet_method__ е начин, по който никога не именоваш свои неща. Само вградени в езика неща се именоват така и знаеш, че можеш да ги предефинираш.

Колкото и да съм съгласен с точка 14, не мога да я приема. Но може да я предадеш като точка 21 :P

Благодаря за обяснението. Явно наистина повечето неща, които са по някакъв начин вътрешни, най-често се налага да са с една долна черта.

Точка 14 да се чете като 21 тогава :D Не се сещам какво друго да допълня, тъй че ще ги оставя така. :)