Temat: Jak podzielić program na funkcje

Don't Repeat Yourself

Jeżeli w programie zauważamy, że jakieś czynności się powtarzają, to jest to pierwsza przesłanka do tego, żeby pomyśleć nad utworzeniem z nich osobnej funkcji.

Funkcja powinna robić dobrze jedną rzecz

Jeżeli deklarujemy, że funkcja coś oblicza, to powinna obliczać, a nie jeszcze dodatkowo dopytywać się o coś użytkownika (to powinna robić inna funkcja).
Jeżeli deklarujemy, że funkcja dodaje do siebie dwie tablice, to powinna dodawać, a nie jeszcze zapisywać do pliku (to powinna robić osobna funkcja).

Nie mieszamy w jednej funkcji czynności związanych z interakcją z użytkownikiem z czynnościami związanymi z przetwarzaniem danych, pracą z systemem plików, to wszystko powinno zostać podzielone na osobne funkcje.

Pomocne w tym jest stosowanie się do wytycznych w zakresie nazewnictwa. Jeżeli nazywamy funkcje według szablonu zrób_coś() pomaga nam to w zapewnieniu, że funkcja robi tylko to.

Funkcja powinna być najkrótsza jak się da

Stosowanie tej zasady wymusza na nas podział programu na jak największą liczbę jak najkrótszych funkcji, co przy okazji sprawia, że eliminujemy powtórzenia i tworzymy funkcje, które rzeczywiście robią jedną rzecz. Ortodoksyjne podejście zakłada maksymalną długość funkcji jako około 5 linijek, co może nie być na początku łatwe, ale jest to pewien ideał, do którego warto dążyć.

Funkcja powinna dawać możliwość ponownego użycia
Staramy się tak pisać funkcje, aby maksymalizować ich uniwersalność i możliwość ich ponownego użycia.

Techniką, która pomaga osiągnąć jak największą uniwersalność kodu jest wydzielanie z funkcji mniejszych funkcji tak długo, aż stwierdzimy, że nic więcej nie da się wydzielić. Efektem jest program z dużą liczbą niewielkich funkcji, z których każda wykonuje jedną, precyzyjnie określoną operację.

Redukujemy sprzężenia czasowe pomiędzy funkcjami
Staramy się pisać program tak, aby poprawne działanie funkcji nie było uzależnione od wcześniejszego wywołania innej.

Wskazówka

Jeżeli widzimy w programie blok kodu, który jest opatrzony komentarzem, to jest to dobra kandydat na wydzielenie funkcji i usunięcie komentarza.

Przykład 1

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

double obliczPoleKwadratu() {
    double dlugoscBoku;
    printf("Podaj dlugosc boku: ");
    scanf("%lf", &dlugoscBoku);
    return dlugoscBoku * dlugoscBoku;
}

void main() {
    double pole;
    pole = obliczPoleKwadratu();
}

Funkcja obliczPoleKwadratu robi dwie rzeczy - dopytuje się użytkownika o długość boku i oblicza pole.

Wersja poprawiona:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

double obliczPoleKwadratu(double dlugoscBoku) {
    return dlugoscBoku * dlugoscBoku;
}

void main() {
    double dlugoscBoku;
    double pole;
    printf("Podaj dlugosc boku: ");
    scanf("%lf", &dlugoscBoku);
    pole = obliczPoleKwadratu(dlugoscBoku);
}