• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Refaktoryzacja funkcji, kod strukturalny

Cloud VPS
0 głosów
561 wizyt
pytanie zadane 10 maja 2017 w C i C++ przez Benek Szeryf (93,190 p.)

Załóżmy, że mamy program w C, którego zadaniem jest odczytanie danych z dwóch plików i znalezienie pewnej relacji R zależnej od danych w obu plikach.

R = R(data1, data2, ...)

Jeśli relacja jest spełniona, program wypisuje dane z pierwszego pliku, ale tylko te które tworzą relację R. Czyli jest to pewnego rodzaju filtracja.

Program przyjmuje jako parametry nazwy plików oraz dodatkowo trzy argumenty opcjonalne, które posiadają wartości domyślne, które też wchodzą do relacji R:

R = R(data1, data2, param1, param2, param3)

Najpierw odczytuję sobie dane z plików i umieszczam je w tablicy, której elementami są struktury (każdy wiersz w pliku jest umieszczony w jednej strukturze). Tablice te to data1, data2. Jak więc uszczuplić liczbę parametrów w funkcji? Mogę oczywiście umieścić dane w zmiennej data, a parametry opcjonalne w zmiennej param:

R = R(data, param)

Czy to właściwy ruch w kierunku refaktoryzacji? W końcu funkcja nadal przyjmuje 5 argumentów, tylko że zaszytych. Idąc tym tropem mogę w jednej zmiennej przemycić 100 argumentów. Być może ważny jest tutaj fakt, że wszystkie argumenty wchodzą do relacji i nie da się ich odseparować. W takim razie miałbym rację. Jak Wy byście to zrobili?

1 odpowiedź

+1 głos
odpowiedź 10 maja 2017 przez rafal.budzis Szeryf (85,820 p.)

Zaszywanie obiektów jest bardzo złe więc nie proponował bym tego rozwiązania. Najlepszą metodą była by obiektowość i w tą stronę bym uciekał. Mały przykładzik jak móglby wyglądać kod na stworzonej klasie Relacja.
 

Relacja R = new Relacja();
R->addFile(data1);
R->addFile(data2);
R->setParam("param1", param1);
R->setParam("param3", param3);

var wynik = R->getRelationData();

Przykład zakłada iż klasa będzie miała 3 metody. Jedną do dodawania plików (addFile dzieki takiemu podejsciu w przyszłości możemy dodać 3 plik), drugą do ustawiania parametrów (setParam dzieki temu możemy pominąć parametr. Gdy robiliśmy to na jednej funkcji chcąc ustawić parametr 3 musielismy podać dwa wcześniejsze) oraz ostatnia metoda getRelationData która zwróci dane w takiej postaci jak teraz zwraca funkcja R z twojego przykładu :)

komentarz 10 maja 2017 przez Benek Szeryf (93,190 p.)
Właśnie chodzi o to, że ten kod ma być w C, gdzie piszemy tylko strukturalnie ;)
komentarz 11 maja 2017 przez rafal.budzis Szeryf (85,820 p.)
To może zrobić taki podział na funkcje w osobnym programie w C zamiast pól zrobić zmienne globalne i potem wywołać w drugim programie C proces pierwszego programu przekazując do uruchomienia programu parametry ? Z ciekawości czemu w C piszesz ?
komentarz 11 maja 2017 przez Benek Szeryf (93,190 p.)

Nie powinno się używać zmiennych globalnych. To zła praktyka.

Z ciekawości czemu w C piszesz?

Zależy mi na dużej wydajności.

1
komentarz 11 maja 2017 przez mokrowski Mędrzec (158,980 p.)

Przedwczesna optymalizacja jest źródłem wszelkiego zła

Donald Knuth 

Czyli popełniłeś błąd i brniesz w niego. Wydajności czego dokładnie? Używanie konkretnych mechanizmów języka związane jest z konsekwencjami wydajności. Będziesz miał RTTI? Będziesz miał wyjątki?Metody wirtualne? Jeśli nie to nasłuchałeś się bajd z krainy "mchu i paproci" że C++ jest mniej wydajny niż C. Polecam poczytać to: http://www.embedded.com/design/programming-languages-and-tools/4438660/3/Modern-C--in-embedded-systems---Part-1--Myth-and-Reality jako wstęp do wyciągnięcia własnych wniosków co jest wydajne a co nie i czym płacisz wybierając.

komentarz 12 maja 2017 przez rafal.budzis Szeryf (85,820 p.)
Pod względem wydajności zmienne globalne to dobra praktyka deklarujesz potrzebną pamieć na starcie a nie podczas działania programu i nie tracisz czasu na zwalnianie pamięci w trakcie działania programu z zmiennych lokalnych. Więc sam sobie teraz zaprzeczyłeś i sam sobie udowadniasz ze wydajność czasem jest głupia. Dużo osób twierdzi ze warto pisać mniej wydajne ale bardziej zrozumiale programy. Dzięki czemu nie popełniamy błędów w kodzie które niszczą wydajność ;) Największą kontrole wydajności będziesz miał w asemblerze jednak nikt by w nim nie pisał skomplikowanego programu ;) Moim zdaniem powinieneś znaleźć złoty środek miedzy wydajnością a czystym kodem.
komentarz 12 maja 2017 przez Benek Szeryf (93,190 p.)

Czyli popełniłeś błąd i brniesz w niego. Wydajności czego dokładnie?

Nie popełniłem błędu, to Ty nie zrozumiałeś o co mi chodzi. Piszę w C, ponieważ potrzebuję wydajnego programu, który pozwoli mi zbadać korelację dwóch próbek. W tym celu program musi wywołać daną funkcję około 10 mln razy (w zależności od liczby danych wejściowych, choć rząd wielkości się zgadza) i policzyć relację R opisaną wyżej. Nie musisz mnie pouczać, bo testowałem to zagadnienie na kodzie napisanym w Pythonie, a później w C, i program napisany w C liczy to około 100 x szybciej.

Po prostu tworząc nowy program, natknąłem się na przypadek, gdzie muszę przekazać do funkcji 5 parametrów lub więcej, więc zastanawiam się czy można taki strukturalny kod zrefaktoryzować, i czy w ogóle ma to sens w przypadku języka C. Ot cała filozofia.

komentarz 12 maja 2017 przez rafal.budzis Szeryf (85,820 p.)
Kurcze chętnie bym napisał odpowiednik w C++ obiektowo żeby porównać szybkość jeśli to dość proste algorytmy. Pokażesz kodzik i opiszesz co robi tu lub na PW ? Python nie jest najszczęśliwszym przykładem bo Python ma już na starcie dużo więcej kodu do zarządzania pamięcią przez GC a C++ mimo obiektowości nie ma chyba GC (ale nie jestem pewny na 100 %)
komentarz 12 maja 2017 przez mokrowski Mędrzec (158,980 p.)
edycja 12 maja 2017 przez mokrowski
Spoko @Benek już Cię nie pouczam :-) Dość że widać nawet Knuth nie miał racji :-)

Podobne pytania

0 głosów
1 odpowiedź 693 wizyt
pytanie zadane 5 czerwca 2017 w C i C++ przez Huberti Gaduła (4,500 p.)
0 głosów
5 odpowiedzi 832 wizyt
pytanie zadane 17 stycznia 2016 w C i C++ przez Informatyk# Obywatel (1,060 p.)
0 głosów
2 odpowiedzi 9,116 wizyt
pytanie zadane 4 października 2015 w C i C++ przez Kubix Nowicjusz (120 p.)

93,487 zapytań

142,423 odpowiedzi

322,773 komentarzy

62,909 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Kursy INF.02 i INF.03
...