Minimalizuj skutki uboczne (najlepiej nie mają żadnych)
Funkcja, która powoduje 3 zmiany stanów poza swoim zakresem, jest znacznie trudniejsza do uzasadnienia i utrzymania niż ta, która po prostu wprowadza coś i wyprowadza coś innego. Nie możesz po prostu wiedzieć, co robi funkcja, musisz pamiętać, co ona zrobiła i jak to wpływa na wszystkie inne istotne funkcje.
Dla OOP minimalizacja skutków ubocznych oznacza także klasy z mniejszą liczbą członków, a zwłaszcza mniejszą liczbą członków, którzy mogą modyfikować stan klasy, ponieważ funkcje składowe mogą modyfikować stany poza własnymi i wywoływać skutki uboczne (mogą np. Manipulować wewnętrznymi elementami klasy). Oznacza to również klasy z mniejszą liczbą własnych elementów danych, dzięki czemu metody te mają mniejszy wpływ i mniej skutków ubocznych, które mogą powodować.
Jako prosty przykład wyobraź sobie próbę zaprojektowania fantazyjnej struktury danych, która może utrzymywać sorted
stan, którego używa do określania, czy należy wyszukiwać binarnie czy liniowo. W takim przypadku przydatne może być podzielenie projektu na dwie klasy. Wywołanie sorted
nieposortowanej klasy może wówczas zwrócić strukturę danych innej klasy, która zawsze utrzymuje posortowaną zawartość. Teraz masz mniej skutków ubocznych (a więc mniej podatnych na błędy i łatwiejszy do zrozumienia kodu), a także kod o szerszym zastosowaniu (poprzedni projekt byłby marnotrawny zarówno w przetwarzaniu, jak i ludzkiej wydajności intelektualnej w przypadku małych tablic, które nigdy nie muszą być sortowane).
Unikaj zbędnych zewnętrznych zależności
Możesz być w stanie zaimplementować najbardziej zwięzły kod, jaki można sobie wyobrazić, przy maksymalnym ponownym użyciu kodu, używając 13 różnych bibliotek do wykonania stosunkowo prostego zadania. Przenosi to jednak na czytelników koszty intelektualne, zmuszając ich do zrozumienia przynajmniej części 13 różnych bibliotek. Ta wrodzona złożoność powinna być natychmiast doceniona przez każdego, kto próbował zbudować i zrozumieć bibliotekę strony trzeciej, która wymagała wciągnięcia i zbudowania kilkunastu innych bibliotek do funkcjonowania.
Jest to prawdopodobnie bardzo kontrowersyjny pogląd, ale wolałbym trochę skromnego powielania kodu od przeciwnej skrajności, pod warunkiem, że wynik końcowy zostanie dobrze przetestowany (nic gorszego niż niesprawdzony wadliwy kod wielokrotnie powielany). Jeśli do wyboru jest 3-liniowy duplikat kodu do obliczenia wektorowego produktu krzyżowego lub pobranie epickiej biblioteki matematycznej tylko po to, by zgolić 3 linie kodu, sugerowałbym tę pierwszą, chyba że cały zespół jest zaangażowany w tę bibliotekę matematyczną , w którym momencie nadal możesz rozważyć napisanie 3 wierszy kodu zamiast 1, jeśli jest to wystarczająco trywialne w zamian za korzyści oddzielenia.
Ponowne użycie kodu jest działaniem równoważącym. Ponowne użycie zbyt wiele i przenosisz złożoność intelektualną w jeden do wielu sposobów, ponieważ w tych 3 wierszach prostego kodu, który zapisałeś powyżej, kosztem jest to, że czytelnicy i opiekunowie muszą zrozumieć znacznie więcej informacji niż 3 linie kodu . Powoduje to również, że kod jest mniej stabilny, ponieważ jeśli zmieni się biblioteka matematyczna, to również może zmienić kod. Ponowne użycie zbyt mało, a także zwielokrotnienie narzutu intelektualnego, a Twój kod przestaje korzystać z centralnych ulepszeń, więc jest to działanie równoważące, ale warto wspomnieć o tym, że jest to działanie równoważące, ponieważ próba wyeliminowania każdej najmniejszej formy skromnego powielania może prowadzić do wyniku, który jest tak trudny do utrzymania, jeśli nie większy, niż przeciwna skrajność.
Przetestuj bzdury
To jest pewne, ale jeśli twój kod nie obsługuje wszystkich przypadków wejściowych i pomija niektóre przypadki skrajne, to jak możesz oczekiwać, że inni zachowają napisany przez ciebie kod, którego nawet nie dostałeś przed przesłaniem go do oczu i rąk? Wystarczająco trudno jest wprowadzić zmiany w kodzie, który działa idealnie, nie mówiąc już o kodzie, który nigdy nie był całkiem właściwy.
Ponadto kod, który przechodzi gruntowne testy, zwykle znajdzie mniej powodów do zmiany. Odnosi się to do stabilności, która jest jeszcze bardziej świętym Graalem do osiągnięcia niż do utrzymania, ponieważ stabilny kod, którego nigdy nie trzeba zmieniać, nie wiąże się z żadnymi kosztami utrzymania.
Dokumentacja interfejsu
Jeśli nie możesz poświęcić równego czasu na dokumentowanie obu, nadaj priorytet „tym, co robią” nad „tym, jak to robią”. Przejrzysty interfejs, który jest oczywisty w swoich zamiarach dotyczących tego, co zrobi (a przynajmniej, co powinien zrobić) we wszystkich możliwych przypadkach wejściowych, zapewni przejrzystość kontekstu dla jego własnej implementacji, która pomoże zrozumieć nie tylko, w jaki sposób korzystać z kodu, ale także jak to działa.
Tymczasem kod, który nie ma tych cech, w którym ludzie nawet nie wiedzą, co powinien zrobić, jest SOL bez względu na to, jak dobrze udokumentowane są szczegóły jego implementacji. 20-stronicowy podręcznik implementacji kodu źródłowego jest bezwartościowy dla osób, które nawet nie potrafią dokładnie ustalić, w jaki sposób powinien on być użyty w ogóle i co powinien zrobić we wszystkich możliwych scenariuszach.
Po stronie implementacji priorytetowo udokumentuj to, co robisz inaczej niż wszyscy inni. Na przykład Intel ma ograniczoną hierarchię woluminów dla swoich jąder raytracingu. Ponieważ pracuję w tej dziedzinie, mogę szybko rozpoznać większość tego, co robi ich kod, bez konieczności przeszukiwania dokumentacji. Robią jednak coś wyjątkowego, co polega na przemierzaniu BVH i równoległym wykonywaniu skrzyżowań przy użyciu pakietów promieni . Właśnie tam chcę, aby priorytetowo traktowali swoją dokumentację, ponieważ te części kodu są egzotyczne i niezwykłe z większości historycznych implementacji BVH.
Czytelność
Ta część jest bardzo subiektywna. Nie dbam tak bardzo o czytelność, która jest bliska procesom myślowym człowieka. Najbardziej dobrze udokumentowany kod opisujący rzeczy na najwyższym poziomie nadal jest dla mnie trudny do naśladowania, jeśli autor używa dziwnych i skomplikowanych procesów myślowych do rozwiązania problemu. Tymczasem zwięzły kod używający 2 lub 3 znaków może często być dla mnie łatwiejszy do zrozumienia, jeśli logika jest bardzo prosta. Myślę, że możesz przejrzeć recenzję i zobaczyć, co wolą inni ludzie.
Najbardziej interesuje mnie łatwość utrzymania, a co ważniejsze, stabilność. Kod, który nie znajduje powodów do zmiany, to taki, który ma zerowe koszty utrzymania.