Estou um pouco confuso sobre como o princípio Aberto Fechado pode ser aplicado na vida real. Exigência em qualquer negócio muda ao longo do tempo. De acordo com o princípio Aberto-Fechado, você deve estender a classe, em vez de modificar a classe existente. Para mim, toda vez que estender uma aula não parece prático para cumprir o requisito. Deixe-me dar um exemplo com o sistema de reservas de trens.
No sistema de reservas de trens, haverá um objeto Ticket. Pode haver diferentes tipos de bilhetes Ticket Regular, Ticket de Concessão etc. Ticket é da classe abstrata e RegularTicket e ConcessionTickets são classes concretas. Como todos os tickets terão o método PrintTicket, que é comum, portanto, ele é escrito em Ticket, que é a classe abstrata base. Digamos que isso funcionou bem por alguns meses. Agora chega um novo requisito, que declara alterar o formato do ticket. Podem ser adicionados mais alguns campos ao ticket impresso ou o formato pode ser alterado. Para cumprir este requisito, tenho as seguintes opções
- Modifique o método PrintTicket () na classe abstrata Ticket. Mas isso violará o princípio Aberto-Fechado.
- Substitua o método PrintTicket () nas classes filho, mas isso duplicará a lógica de impressão, que é uma violação do princípio DRY (não se repita).
Então as perguntas são
- Como posso satisfazer os requisitos comerciais acima sem violar o princípio Aberto / Fechado.
- Quando a classe deve ser fechada para modificação? Quais são os critérios para considerar que a classe está fechada para modificação? É após a implementação inicial da classe ou pode ser após a primeira implantação na produção ou pode ser outra coisa.