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

Refaktoryzacja funkcji, kod strukturalny

Object Storage Arubacloud
0 głosów
281 wizyt
pytanie zadane 10 maja 2017 w C i C++ przez Benek Szeryf (90,870 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,260 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 (90,870 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,260 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 (90,870 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 (155,460 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,260 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 (90,870 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,260 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 (155,460 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ź 393 wizyt
pytanie zadane 5 czerwca 2017 w C i C++ przez Huberti Gaduła (4,500 p.)
0 głosów
5 odpowiedzi 511 wizyt
pytanie zadane 17 stycznia 2016 w C i C++ przez Informatyk# Obywatel (1,060 p.)
0 głosów
2 odpowiedzi 8,653 wizyt
pytanie zadane 4 października 2015 w C i C++ przez Kubix Nowicjusz (120 p.)

92,555 zapytań

141,403 odpowiedzi

319,554 komentarzy

61,939 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.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...