Middle
Por qual princípio os métodos são agrupados e separados nas interfaces?
sobes.tech IA
Resposta da IA
Os métodos nas interfaces são agrupados e separados de acordo com o princípio de coesão de comportamento e o princípio de contrato explícito.
- Coesão de comportamento: Os métodos que representam um conjunto único de operações com uma entidade ou que realizam ações semelhantes em significado são agrupados numa única interface. Isto melhora a legibilidade do código, facilita a compreensão do propósito da interface e aumenta a sua reutilização.
- Contrato explícito: A interface descreve um contrato explícito que as classes que a implementam devem cumprir. Cada método na interface faz parte deste contrato. Os métodos são divididos entre diferentes interfaces se representam aspetos diferentes do comportamento ou se a sua implementação pode variar independentemente. Por exemplo, a interface
Readablepode conter métodos para ler dados, eWritablepara escrever. Uma classe pode implementar uma ou ambas as interfaces, dependendo das suas capacidades.
Esta abordagem favorece os princípios SOLID, em particular:
- Princípio da responsabilidade única: A interface tem uma única razão para mudar, que é a modificação do conjunto de comportamentos que descreve.
- Princípio da segregação de interfaces: Os clientes não devem depender de interfaces que não utilizam. Dividir interfaces grandes em outras mais pequenas e focadas permite que as classes implementem apenas as interfaces que realmente precisam.
Exemplo:
Suponhamos que temos uma entidade que pode ser guardada e carregada. Em vez de uma única interface Persistable com dois métodos save() e load(), é melhor criar duas interfaces separadas:
// Interface para entidades que podem ser guardadas
interface Savable
{
public function save(): void;
}
// Interface para entidades que podem ser carregadas
interface Loadable
{
public function load(): void;
}
Uma classe que pode ser guardada e carregada implementa ambas as interfaces:
// Classe que implementa ambas as interfaces
class DataObject implements Savable, Loadable
{
public function save(): void
{
// Lógica de salvamento
}
public function load(): void
{
// Lógica de carregamento
}
}
Uma classe que só é guardada implementa apenas Savable:
// Classe que implementa apenas a interface Savable
class TempData implements Savable
{
public function save(): void
{
// Lógica de salvamento de dados temporários
}
}
Isto permite projetar classes e as suas dependências de forma mais flexível.