Jak pisać kod, żeby chcieć do niego wrócić i wiedzieć co się w nim dzieje

Cześć,
w tym artykule chciałbym podzielić się z wami moimi przemyśleniami związanymi z pisaniem kodu.
Każdy kiedyś zaczynał naukę pisania programów w danym języku. Na samym początku, nasze programy to były głównie przepisane gotowe formułki, które "działały". Cieszyliśmy się z tego, że pojawiła się konsola i mogliśmy coś sobie tam wpisać.
Z czasem, zaczęliśmy pisać już bardziej świadomie. Używaliśmy dokumentacji, uczyliśmy się nowych instrukcji. Nasz kod wyglądał pewnie tak, że wrzucaliśmy wszystko do jednej klasy/pliku i cieszyliśmy się, że nasz program działa, i że to my go napisaliśmy od zera.
Po pewnym czasie, zobaczyliśmy że nasz kod jest co raz większy i staje się dla nas niezrozumiały już po kilku dniach przerwy. Pewnie wtedy dowiedzieliśmy się, że kod trzeba w pewien sposób wydzielać. Że są metody/funkcje, że są klasy. Oczywiście zaczęliśmy używać tego typu elementów do rozdzielania naszego kodu na mniejsze części.
Było już lepiej, ale wciąż po kilkudniowej przerwie, wciąż te nasze nazwy zmiennych, nazwy metod były słabo zrozumiałe. Zaczęliśmy staranniej nazywać zmienne, metody, klasy, widzieliśmy że już możemy zrobić tydzień przerwy i nasz kod jest zrozumiały. Wielu pewnie czuło satysfakcję.
Nadszedł jednak pewien moment (bądź jeszcze nie), że pomyśleliśmy - "A czemu by tak nie pisać kodu tak, aby można było czytać go jak książkę w języku angielskim?"
Każdy chyba pamięta jak trzeba było czytać lektury. Niektórzy to lubili, niektórzy mniej, ale zawsze po przeczytaniu takiej książki, mieliśmy w pamięci sporo informacji na temat przeczytanej książki.
Na takiej samej zasadzie właśnie można pisać kod. Tak, żeby czytać go jak książkę. W naszym przypadku, książka byłaby połączona w podstrony. Kod czytamy wtedy "wgłąb".
Nie wiem ilu z was miało takie odczucia jak ja je tutaj opisałem, ale taki tok myślenia pozwala na przyjemniejsze powroty do naszego kodu napisanego jakiś czas temu.
Powiem wam właśnie jakie narzędzie może służyć do upiększania naszego kodu.
Jest to zwykły REFACTORING.
Tyle i aż tyle. Dzięki tej opcji, nasz kod może zostać upiększony do wersji jak najbardziej czytelnej. Oczywiście najlepiej sprawdza się przy większej ilości kodu.
Podam wam teraz "wycinek" takiego kodu, gdzie mamy kod bez "upiększaczy" i wersję "książkową".

public class UglyCode {
   
    private int a = 0;
    private int b = 0;
    private static Random r = new Random();

    public UglyCode(int a, int b) {
        this.a = a;
        this.b = b;
        String text = "Szczęśliwe liczby: ";
        text = text + a + ", " + b;
        System.out.println(doStuff(text));
    }

    public String doStuff(String text) {
        int c = r.nextInt(10);
        while(c == 7) {
            c = r.nextInt(10);    
        }
        text = text + ", " + c;

        return text;
     }
}

A teraz, nadajmy temu programowi trochę duszy i zabawmy się w pisarzy :D

public class HappyNumberPrinter {
   
    private int firstTrulyRandomNumberToPrint = 0;
    private int secondTrulyRandomNumberToPrint = 0;
    private static Random randomManWhoWillGiveUsNumber = new Random();

    public HappyNumberPrinter (int firstTrulyRandomNumberToPrint, int secondTrulyRandomNumberToPrint) {
        this.firstTrulyRandomNumberToPrint = firstTrulyRandomNumberToPrint;
        this.secondTrulyRandomNumberToPrint = secondTrulyRandomNumberToPrint;
     }

    public void showMeSomeHappyNumbers() {
        String happyNumbersText = "Szczęśliwe liczby: ";
        happyNumbersText = concatenateMyNumber(happyNumbersText, firstTrulyRandomNumberToPrint);      
        happyNumbersText = concatenateMyNumber(happyNumbersText, secondTrulyRandomNumberToPrint);
        int ourLuckyHappyNumber =  askMenToGiveUsHappyLuckyNumber();
        happyNumbersText = concatenateMyNumber(happyNumbersText, ourLuckyHappyNumber);      
        putOnScreenHappyText(happyNumbersText);
    }
    
    private putOnScreenHappyText(String happyTextToPut) {
         System.out.println(happyTextToPut);
    }

    private String concatenateMyNumber(String currentTextToPrint, int numberToConcatenate) {
        currentTextToPrint = currentTextToPrint + ", " + numberToConcatenate;
        return currentTextToPrint;
    }
    private int askMenToGiveUsHappyLuckyNumber() {
        int luckyNumberCandidate = randomManWhoWillGiveUsNumber.nextInt(10);
        while(isNotOurExpectedLuckyNumber(luckyNumberCandidate)) {
            luckyNumberCandidate = randomManWhoWillGiveUsNumber.nextInt(10);
        } 
        return luckyNumberCandidate;
     }

    private boolean isNotOurExpectedLuckyNumber(candicateToBeLuckyNumber) {
        return candicateToBeLuckyNumber == 7;
    }
}

Uff, to było ciekawe doświadczenie, gdy jedyny kompilator, to twoja głowa :)
Porównajcie sobie klasy, obie robią praktycznie identyczne czynności, jednak nazwy zmiennych, klasy i metod są inne.
Gdyby kod wyglądał tak jak ten drugi przykład, to czytanie kodów źródłowych byłoby czystą przyjemnością.
A wy, jakie macie zdanie na temat pisania kodu "ładnie"?

H2
H3
H4
3 columns
2 columns
1 column
Join the conversation now
Logo
Center