Я недавно столкнулся со следующей ситуацией.
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
представляет объект в физическом мире, что является веским аргументом для того, чтобы не разделять класс». Мне, к сожалению, сказали об этом, когда я начал программировать. Мне потребовались годы, чтобы понять, что это хоккей с лошадью. Это ужасная причина для группировки вещей. Я не могу сформулировать, что является вескими причинами для группировки вещей (по крайней мере, к моему удовлетворению), но это та, которую вы должны отказаться прямо сейчас. В конечном итоге, будь весь «хороший код», это то, что он работает правильно, относительно прост для понимания и относительно легко изменить (то есть изменения не имеют странных побочных эффектов).