Powtarzalny kod, jak go skrócić?

0

Mam kilka funkcji, które właściwie robią to samo - różnią się właściwie jedną linijką, w której wywoływana jest odpowiednia dla danej funkcji inna funkcja. Reszta jest właściwie identyczna. Tak sobie rozmyslam, jak skrócić taki kod? Przykład:

void runX(args)
{
    // init zmiennych, itp
    // wywolanie funkcji funXX()
    // zapis do pliku wynikow
}

void runY(args)
{
    // init zmiennych, itp
    // wywolanie funkcji funYY()
    // zapis do pliku wynikow
}
0

Refaktoryzacja kodu - http://en.wikipedia.org/wiki/Code_refactoring
Robisz sobie osobną metodę (lub osobne metody) dla fragmentów kodu, który się powtarza. Wtedy masz te części wyodrębnione, przez co kod staje się czytelniejszy, krótszy i lepszy.
W metodach, które korzystają ze wspólnego kodu, po prostu używasz tych wyodrębnionych metod.

Innym wyjściem pewnie będzie zmiana struktury programu i zastosowanie polimorfizmu.

0

W c++ możesz użyć do tego: http://www.cplusplus.com/reference/functional/ ale to głównie jeśli sygnatury tych funkcji są takie same.

0
Shalom napisał(a):

W c++ możesz użyć do tego: http://www.cplusplus.com/reference/functional/ ale to głównie jeśli sygnatury tych funkcji są takie same.

Dokładnie. A jeśli nie są użyj szablonów. Moim zdaniem to rozwiązuje Twój problem.

0

@allocer: i to może być jakiś pomysł, na razie zatrzymam się chyba przy tym. Mój błąd, bo trochę mało dokładnie opisałem problem. Kod jest nieco bardziej rozbudowany, właściwie wygląda tak:

void runX(args)
{
    // init zmiennych, itp
    // 1-sze wywolanie funkcji funXX()
    // ... 
    // 2-gie wywolanie funkcji funXX()
    // ...
    // 3-cie wywolanie funkcji funXX()
    // zapis do pliku wynikow
}
 
void runY(args)
{
    // init zmiennych, itp
    // 1-sze wywolanie funkcji funYY()
    // ... 
    // 2-gie wywolanie funkcji funYY()
    // ...
    // 3-cie wywolanie funkcji funYY()
    // zapis do pliku wynikow
}

@Shalom: sygnatury są takie same, ale niestety nie mogę korzystać z rozwiązań dla C++, zależy mi tylko na C. Chyba dałem omyłkowo tag C++ zamiant C, przepraszam za wprowadzenie w błąd.

@Endrju: Szablonów nie mogę użyć, o z tego co pamiętam w czystym C takowych nie ma, a ja piszę w czystym C i nie mogę wmieszać nic z C++.

1
tnij napisał(a):

@Shalom: sygnatury są takie same, ale niestety nie mogę korzystać z rozwiązań dla C++, zależy mi tylko na C. Chyba dałem omyłkowo tag C++ zamiant C, przepraszam za wprowadzenie w błąd.

@Endrju: Szablonów nie mogę użyć, o z tego co pamiętam w czystym C takowych nie ma, a ja piszę w czystym C i nie mogę wmieszać nic z C++.

W C masz wskaźniki do funkcji.

0
void runXY(args, bool b)
{
    // init zmiennych, itp
     if (b)
        funXX();
    else
        funYY();
    // zapis do pliku wynikow
}

i jeśli będzie to konieczne,

void runX(args)
{
    runXY(args, true);
}

void runY(args)
{
    runXY(args, false);
}
0
#include <stdio.h>
#include <stdlib.h>
 
typedef void (*VFUNCV)(void);
 
void fun1() { printf("fun1\n"); }
void fun2() { printf("fun2\n"); }
 
void call(int which, VFUNCV* fun)
{
    fun[which]();
}
 
int main()
{
    VFUNCV fun[2] = {fun1, fun2};
    call(1, fun);
    return 0;
}

http://ideone.com/jGYOhk

Zrob po prostu cos takiego.

1 użytkowników online, w tym zalogowanych: 0, gości: 1