for x in range(0, 12):
print arr[x]
fox index in range(0, NUMBER_OF_MONTHS):
print monthNames[index]
Когато пишете код, рядко го правите самоцелно. Вместо това, вие опитвате се да решите някакъв реален проблем със собствена логика, терминология и особености. Винаги когато пишете код трябва да се стараете той да отразява много добре този проблем - това го прави много по-четим, по-лесен за поддръжка и по-разбираем от външни хора. Още повече, така вие ясно показвате намерението което вашия код има, вместо да карате читателя да задълбава в особенностите на вашата реализация.
Променливите обикновенно отговарят за съществуващи обекти/концепции в реалния проблем, който решавате. Това ги прави идеални за комуникиране на идеята на кода. За целта, обаче, се налага да избирате смислени имена.
# Грешно
temp = sqrt(b ** 2 - 4 * a * c)
x1 = (-b + temp) / (2 * a)
x2 = (-b - temp) / (2 * a)
# По-правилно
discriminant = sqrt(b ** 2 - 4 * a * c)
x1 = (-b + discriminant) / (2 * a)
x2 = (-b - discriminant) / (2 * a)
old = readOld()
tupple = getValues(r'c:\')
tup = {}
for t in tupple:
if old[t] != tupple[t]: continue
tup.update({t:tupple[t]})
show(tup)
save(tupple)
oldHashsums = readCachedHashsums()
newHashsums = findHashsums(r'c:\')
changedFiles = {}
for filename in oldHashsums:
if oldHashsums[filename] != newHashsums[filename]:
changedFiles[filename] = newHashsums[filename]
reportChanges(changedFiles)
saveHashsums(newHashsums)
Рутините са едно от най-често използваните средства в програмирането. И все пак, причините за които има смисъл да създавате рутина са.
При именуване на рутини се съобразявайте внимателно със следните неща.
doStuff()
, generateData()
, processInput()
.wait2()
и wait3()
."Кохезията" на една рутина смътно описва действието й. Като говорим за "добра кохезия" имаме предвид, че една рутина прави едно единствено нещо и го прави добре. Най-силния вид "кохезия" е функционалната. Други видове са:
Startup()
, Shutdown()
Неприемлив вид кохезия
Лош подход.
def storePerson(name, age, address):
if not isinsntace(name, str) or len(name) < 6:
raise ValueError("Illegal name")
if not isinstance(age, int, long) or age < 0:
raise ArithmeticError("Illegal age")
if not hasattr(address, "street") or not hassattr(address, "number"):
raise ValueError("Illegal address")
storeData(name, age, address.street, address.number)
По-добър подход.
def storePerson(name, age, address):
assert long(age) >= 6
assert isinstance(name, str) and len(name) >= 6
storeData(name, age, address.street, address.number)
Когато пиеше функции, не ползвайте глобални променливи. Ама въобще. Най-честия случай
на неправилно ползване на глобавни променливи е когато се употребяват за комуникация между
функции. Никога не правете това. В рядките случаи, в които имате нужда от
"глобални" обекти правете Singleton-и или thread.local
-и.
В Python няма goto. Ако случайно пишете на друг език, в който има goto, това правило остава - не ползвайте goto.
Подходи за намаляване на сложността: