S = Princípio da responsabilidade única
Então, eu esperaria ver uma estrutura de pastas / arquivos bem organizada e hierarquia de objetos. Cada classe / parte da funcionalidade deve receber um nome que sua funcionalidade é muito óbvia e deve conter apenas lógica para executar essa tarefa.
Se você visse grandes classes de gerentes com milhares de linhas de código, isso seria um sinal de que uma única responsabilidade não estava sendo seguida.
O = Princípio aberto / fechado
Essa é basicamente a ideia de que novas funcionalidades devem ser adicionadas por meio de novas classes que tenham um impacto mínimo / exigem modificação da funcionalidade existente.
Eu esperaria ver muito uso de herança de objeto, sub-digitação, interfaces e classes abstratas para separar o design de uma parte da funcionalidade da implementação real, permitindo que outras pessoas venham e implementem outras versões ao lado sem afetar o original.
L = princípio de substituição de Liskov
Isso tem a ver com a capacidade de tratar subtipos como o tipo pai. Isso sai da caixa em C # se você estiver implementando uma hierarquia de objetos herdada adequada.
Eu esperaria ver o código tratando objetos comuns como seu tipo base e chamando métodos nas classes base / abstract em vez de instanciar e trabalhar nos próprios subtipos.
I = Princípio de Segregação de Interface
Isso é semelhante ao SRP. Basicamente, você define subconjuntos menores de funcionalidade como interfaces e trabalha com aqueles para manter seu sistema dissociado (por exemplo, um FileManager
pode ter a única responsabilidade de lidar com a E / S do arquivo, mas isso poderia implementar um IFileReader
e IFileWriter
que continha as definições de método específicas para a leitura e gravação de arquivos).
D = Princípio da inversão de dependência.
Novamente, isso se refere a manter um sistema desacoplado. Talvez você esteja atento ao uso de uma biblioteca do .NET Dependency Injection, sendo usada na solução como Unity
ou Ninject
ou em um sistema ServiceLocator como AutoFacServiceLocator
.