Нещодавно я натрапив на таку ситуацію.
class A{
public:
void calculate(T inputs);
}
По-перше, A
являє собою об'єкт у фізичному світі, що є сильним аргументом для нерозбиття класу. Зараз, calculate()
виявляється, досить довга і складна функція. Я сприймаю три можливі структури для цього:
- запишіть це як стінку тексту - переваги - вся інформація знаходиться в одному місці
- писати
private
функції класу в класі та використовувати їх уcalculate
тілі тіла - недоліки - решта класу не знає / не піклується / не розуміє про ці методи написати
calculate
так: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); }
Чи можна це вважати хорошою чи поганою практикою? Чи виявляє такий підхід якісь проблеми? Загалом, чи слід вважати це добрим підходом, коли я знову стикаюся з тією ж ситуацією?
Редагувати:
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.
...
}
Усі ці методи:
- отримати значення
- обчислити деякі інші значення, не використовуючи стан
- зателефонуйте до деяких із "підмодельних об'єктів", щоб змінити їх стан.
Виявляється, що, за винятком set_room_size()
цих методів, просто передає потрібне значення суб'єктам. set_room_size()
з іншого боку, робить пару екранів незрозумілих формул, а потім (2) робить половину екрана виклику наборів підпредметів, щоб застосувати різні отримані результати. Тому я розділив функцію на дві лямбда і називаю їх у кінці функції. Якби мені вдалося розділити це на більш логічні шматки, я б виділив більше лямбда.
Незважаючи на те, мета поточного питання полягає у визначенні того, чи повинен такий спосіб мислення зберігатись, чи він у кращому випадку не додає цінності (читабельність, ремонтопридатність, здатність налагодження тощо).
Firstly, A represents an object in the physical world, which is a strong argument for not splitting the class up.
Напевно A
представляє дані про об'єкт, який міг би існувати у фізичному світі. Ви можете мати екземпляр A
без реального об'єкта і реального об'єкта без екземпляра A
, тому поводитися з ними так, як вони одне й те саме, є безглуздим.
calculate()
не знатиме про ці підфункції.
A
, це сприймає це трохи до крайності.
A
являє собою об'єкт у фізичному світі, що є сильним аргументом для нерозбиття класу на". Про це мені, на жаль, сказали, коли я почав програмувати. Мені знадобилися роки, щоб зрозуміти, що це купа хокейного коня. Це жахлива причина групувати речі. Я не можу сформулювати, які є вагомі причини для групування речей (принаймні, на моє задоволення), але це одна, яку ви повинні відкинути зараз. Зрештою, будьте всім "хорошим кодом", це те, що він працює правильно, досить легко зрозуміти і змінити відносно легко (тобто зміни не мають дивних побічних ефектів).