Piszę kod Ruby dla prostego ćwiczenia szyfrowania i często napotykałem ten dylemat (ćwiczenie to szyfr pasjansa, jeśli musisz wiedzieć). Pytanie dotyczy tego, czy powinienem uzupełnić moją logikę o zmienne opisowe i instrukcje jednoetapowe, które czynią tę funkcję czytelną zamiast zwięzłych, a nawet gęstych instrukcji, które eliminują powtarzanie i / lub minimalizują błędy.
Mój najnowszy przykład: Mój program pobiera dane wejściowe, a ze względu na sztywne wytyczne formatowania może łatwo określić, czy dane wejściowe powinny być szyfrowane, czy odszyfrowywane. Aby uprościć, po przekonwertowaniu / wygenerowaniu klucza szyfrującego i wiadomości w celu ich zgodności, należy odjąć klucz od zaszyfrowanej wiadomości lub dodać klucz do niezaszyfrowanej wiadomości, aby uzyskać pożądany wynik (myśl o kluczu jako o szyfrowaniu, wiadomość + szyfrowanie = kod; kod - szyfrowanie = wiadomość). Pozycja DRY mówi mi, że powinienem przekonwertować zaszyfrowaną wiadomość inaczej niż wiadomość niezaszyfrowaną, aby funkcja, która pobiera klucz szyfrowania i stosuje go do wiadomości, nigdy nie musiała się rozróżniać. Odkryłem, że oznacza to, że potrzebuję zagnieżdżonych instrukcji if w funkcji, ale logika wydaje się być solidna. Ten kod nie jest jednak łatwy do odczytania.
Z drugiej strony mógłbym napisać dwie różne funkcje, które są wywoływane na podstawie flagi ustawianej, gdy aplikacja określa szyfrowanie lub deszyfrowanie. Byłoby to łatwiejsze do odczytania, ale powielałoby funkcję wysokiego poziomu stosowania klucza szyfrowania do wiadomości (powodując, że jest ona szyfrowana lub odszyfrowywana).
Czy powinienem skłaniać się w kierunku czytelnego kodu lub zwięzłego kodu? A może przegapiłem inny sposób na uzyskanie tej funkcjonalności i spełnienie obu zasad? Czy jest to pozycja w skali, w której należy wziąć pod uwagę cel projektu i podjąć najlepsze decyzje, aby mu służyć?
Do tej pory kładę nacisk na zwięzły, suchy kod zamiast czytelnego kodu.