I — Interface Segregation

  1. SSingle Responsibility
  2. OOpen/Closed
  3. LLiskov Substitution
  4. IInterface Segregation
  5. DDependency Inversion

FileHandler

SimpleReader

Before

interface ReportGenerator
{
    public function generateInventoryReport(): string;
    public function generateInvoiceReport(): string;
    public function emailReport(string $report): void;
    public function exportToPdf(string $report): string;
}

class InventoryReportGenerator implements ReportGenerator
{
    public function generateInventoryReport(): string { /* ... */ }
    public function generateInvoiceReport(): string { throw new LogicException('n/a'); }
    public function emailReport(string $report): void { /* ... */ }
    public function exportToPdf(string $report): string { throw new LogicException('n/a'); }
}

After

interface GeneratesReport
{
    public function generate(): string;
}

interface ExportsToPdf
{
    public function toPdf(string $report): string;
}

class InventoryReportGenerator implements GeneratesReport
{
    public function generate(): string { /* ... */ }
}
{CC}