Niedawno wpadłem na następującą sytuację.
class A{
public:
void calculate(T inputs);
}
Po pierwsze, A
reprezentuje obiekt w świecie fizycznym, co jest silnym argumentem za nierozdzielaniem klasy. Teraz calculate()
okazuje się dość długą i skomplikowaną funkcją. Widzę trzy możliwe struktury:
- napisz to jako ścianę tekstu - zalety - wszystkie informacje są w jednym miejscu
- pisz
private
funkcje użytkowe w klasie i używaj ich wcalculate
ciele - wady - reszta klasy nie zna / nie dba / nie rozumie tych metod napisz
calculate
w następujący sposób:void A::calculate(T inputs){ auto lambda1 = () [] {}; auto lambda2 = () [] {}; auto lambda3 = () [] {}; lambda1(inputs.first_logical_chunk); lambda2(inputs.second_logical_chunk); lambda3(inputs.third_logical_chunk); }
Czy można to uznać za dobrą lub złą praktykę? Czy takie podejście ujawnia jakieś problemy? Podsumowując, czy powinienem uznać to za dobre podejście, gdy znów mam do czynienia z tą samą sytuacją?
EDYTOWAĆ:
class A{
...
public:
// Reconfiguration of the algorithm.
void set_colour(double colour);
void set_density(double density);
void set_predelay(unsigned long microseconds);
void set_reverb_time(double reverb_time, double room_size);
void set_drywet(double left, double right);
void set_room_size(double value);;
private:
// Sub-model objects.
...
}
Wszystkie te metody:
- uzyskać wartość
- oblicz inne wartości bez użycia stanu
- wywołać niektóre z „obiektów podmodelu”, aby zmienić ich stan.
Okazuje się, że poza set_room_size()
tymi metodami po prostu przekazują żądaną wartość do podobiektów. set_room_size()
z drugiej strony wykonuje kilka ekranów niejasnych wzorów, a następnie (2) wykonuje pół ekranu wywoływania seterów podobiektów w celu zastosowania różnych uzyskanych wyników. Dlatego podzieliłem funkcję na dwie lambdy i wywołałem je na końcu funkcji. Gdybym był w stanie podzielić to na bardziej logiczne części, izolowałbym więcej lambdów.
Niezależnie od tego, celem obecnego pytania jest ustalenie, czy taki sposób myślenia powinien się utrzymywać, czy w najlepszym razie nie stanowi wartości dodanej (czytelność, łatwość konserwacji, zdolność debugowania itp.).
Firstly, A represents an object in the physical world, which is a strong argument for not splitting the class up.
Z pewnością A
reprezentują dane o obiekcie, który mógłby istnieć w świecie fizycznym. Możesz mieć instancję A
bez rzeczywistego obiektu i prawdziwy obiekt bez instancji A
, więc traktowanie ich tak, jakby były jednym i tym samym, jest nonsensowne.
calculate()
będzie wiedział o tych podfunkcjach.
A
, to prowadzi to do skrajności.
A
reprezentuje obiekt w świecie fizycznym, co jest mocnym argumentem za tym, aby nie dzielić klasy”. Niestety powiedziano mi to, kiedy zaczynałem programować. Lata zajęło mi uświadomienie sobie, że jest to hokej na trawie. To okropny powód do grupowania rzeczy. Nie potrafię wyartykułować, jakie są dobre powody, by grupować rzeczy (przynajmniej dla mojej satysfakcji), ale ten właśnie należy odrzucić teraz. Koniec końców „dobry kod” polega na tym, że działa poprawnie, jest względnie łatwy do zrozumienia i stosunkowo łatwy do zmiany (tj. Zmiany nie mają dziwnych skutków ubocznych).