Recentemente, encontrei a seguinte situação.
class A{
public:
void calculate(T inputs);
}
Em primeiro lugar, A
representa um objeto no mundo físico, que é um forte argumento para não dividir a classe. Agora, calculate()
acaba por ser uma função bastante longa e complicada. Eu percebo três estruturas possíveis para isso:
- escreva como uma parede de texto - vantagens - todas as informações estão em um só lugar
- escrever
private
funções utilitárias na classe e usá-las nocalculate
corpo da pessoa - desvantagens - o resto da classe não conhece / se importa / entende sobre esses métodos escreva
calculate
da seguinte maneira: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); }
Isso pode ser considerado uma boa ou má prática? Essa abordagem revela algum problema? Em suma, devo considerar isso uma boa abordagem quando me encontrar novamente com a mesma situação?
EDITAR:
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.
...
}
Todos esses métodos:
- obter um valor
- calcular alguns outros valores, sem usar state
- chame alguns dos "objetos de submodelo" para alterar seu estado.
Acontece que, exceto set_room_size()
, esses métodos simplesmente passam o valor solicitado para subobjetos. set_room_size()
, por outro lado, faz algumas telas de fórmulas obscuras e (2) faz meia tela de chamada de setters de subobjetos para aplicar os vários resultados obtidos. Portanto, eu separei a função em duas lambdas e as chamo no final da função. Se eu fosse capaz de dividi-lo em pedaços mais lógicos, eu teria isolado mais lambdas.
Independentemente disso, o objetivo da pergunta atual é determinar se esse modo de pensar deve persistir ou, na melhor das hipóteses, não agrega valor (legibilidade, capacidade de manutenção, capacidade de depuração etc.).
Firstly, A represents an object in the physical world, which is a strong argument for not splitting the class up.
Certamente A
representa dados sobre um objeto que poderia existir no mundo físico. Você pode ter uma instância A
sem o objeto real e um objeto real sem uma instância de A
, portanto, tratá-los como se fossem um e o mesmo não faça sentido.
calculate()
saberá sobre essas sub-funções.
A
, isso levará um pouco ao extremo.
A
representa um objeto no mundo físico, que é um forte argumento para não dividir a classe." Infelizmente, me disseram isso quando comecei a programar. Levei anos para perceber que é um monte de hóquei em cavalos. É uma terrível razão para agrupar as coisas. Não consigo articular quais são as boas razões para agrupar as coisas (pelo menos para minha satisfação), mas essa é uma que você deve descartar agora. No fim das contas, todo o "código bom" é que ele funciona corretamente, é relativamente fácil de entender e é relativamente fácil de mudar (ou seja, mudanças não têm efeitos colaterais estranhos).