4 rzeczy, które pomogą pisać czytelny kod
Pisanie złego kodu jest nieuniknione. Każdemu się to zdarza w jakimś momencie życia i nie jest to nawet często ich wina. Studia nie nauczą Cię niestety tego, czego potrzeba do napisania czystego i zwięzłego kodu. Jest jednak parę wskazówek, których przestrzeganie sprawi, że będzie to przychodzić bardziej naturalnie.
Pułapka zastawiona przez If
Przestań domyślnie używać instrukcji else. Poświęcenie czasu na przemyślenie tego, co próbujesz zrobić, może zaoszczędzić czas na późniejszym debugowaniu skomplikowanej logiki. Zobaczmy prosty przykład:
if (index < length):
query.append(row + ',\n')
else:
query.append(row)
Powyższe nie jest trudne do odczytania, ale wystarczy dodać kilka dodatkowych wierszy kodu i już się zaczyna tracić orientację. Usuńmy więc powieloną logikę i uprośćmy wywołania:
query.append(row)
if(index != length):
query.append(',\n')
Prosty refaktor sprawił, że widzimy zawsze dodawany wiersz. Jeśli robisz to samo w przypadku if oraz else, wyłącz to na zewnątrz.
Używaj wbudowanych funkcji
Prześladowało mnie to od dawna. Nie poświęcałem zbyt wiele czasu na znalezienie funkcji wbudowanych w dany język. Dlatego mój kod był często niepotrzebnie spuchnięty. Poniżej mamy snippet, którego użyłem do połączenia wszystkich wierszy tablicy. Wszystkie wiersze, z wyjątkiem ostatniego, musiały być oddzielone przecinkiem.
def gen_table_sql(table_obj):
row_len = length(table_obj)
query = ""
for index, row in enumerate(table_obj['columns']):
query.append(row)
# Needed so last line doesnt have a comma
if (index < length):
query.append(',\n')
return query
Wykonałem iterację po każdym wierszu, sprawdzając po drodze, czy jestem w ostatnim wierszu tablicy. Kod nie wygląda jeszcze tak strasznie, ale odczytanie go już trochę zajmuje. Potem stwierdziłem, że mogę zrobić to samo przy użyciu metody string join. Dzięki temu te wszystkie powyższe linijki mogłem zawrzeć w jednej:
def gen_table_sql(table_obj):
# Joins all rows with a comma and a newline except for the last
query = ',\n'.join(table_obj['columns'])
return query
Przestań ukrywać logikę w funkcjach
Kierując się zasadą jednej odpowiedzialności (ang. single responsibility principle), wiemy, że chcemy, aby każda funkcja robiła tylko jedną rzecz. Z powyższego przykładu może wynikać, że tak właśnie jest. Ukrywa to jednak tajną logikę, a dokładniej fakt, że funkcja wymaga, aby table_obj miała właściwość o nazwie columns. Ponadto wymagane jest również, aby atrybut kolumny był listą.
def gen_table_sql(col_list):
# Joins all rows with a comma and a newline except for the last
query = ',\n'.join(col_list)
return query
Jest to lepszy sposób na napisanie tej funkcji. Przekazujesz wtedy po prostu najprostsze możliwe dane, takie jak gen_table_sql(table_obj [„columns”])
.
Dużo opisuj
Ostatnim krokiem w pisaniu lepszego kodu jest opisowość. Poniżej zmieniłem nazwę funkcji, aby opisać to, co ona robi. Oprócz dobrego nazewnictwa dodałem też dokumentację, aby podczas developmentu mieć krótki opis w moim edytorze, jak widać to zresztą poniżej:
def join_col_list(col_list):
'''Takes in column list and joins with commas to form sql
statement'''
query = ',\n'.join(col_list)
return query
Podsumowanie
Może i są to proste wskazówki, ale pomogą w tworzeniu bardziej przejrzystego kodu. Ta tendencja do upraszczania zaprocentuje z czasem wzrostem produktywności, dzięki temu, że będzie łatwiej odczytać i zrozumieć kod, który tworzysz.
Oryginał tekstu w języku angielskim możesz przeczytać tutaj.