2010-05-29 3 views
2

J'essaie d'apprendre les pragmatiques SOLIDES. J'ai écrit deux types de style de code. que l'on est:
1) Responsabilité unique Principle_2.cs: si vous regardez le programme principal toutes les instances de l'interface générée
1) Responsabilité unique Principle_3.cs: si vous regardez le programme principal toutes les instances genareted de la classe normale
Ma question: laquelle est l'utilisation correcte? lequel puis-je préférer?Single Responsibility Principe d'utilisation Comment puis-je appeler une sous-méthode correctement?

namespace Single_Responsibility_Principle_2 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      IReportManager raporcu = new ReportManager(); 
      IReport wordraporu = new WordRaporu(); 

      raporcu.RaporHazırla(wordraporu, "data"); 
      Console.ReadKey(); 
     } 
    } 

    interface IReportManager 
    { 
     void RaporHazırla(IReport rapor, string bilgi); 
    } 

    class ReportManager : IReportManager 
    { 
     public void RaporHazırla(IReport rapor, string bilgi) 
     { 
      rapor.RaporYarat(bilgi); 
     } 
    } 


    interface IReport 
    { 
     void RaporYarat(string bilgi); 
    } 

    class WordRaporu : IReport 
    { 
     public void RaporYarat(string bilgi) 
     { 
      Console.WriteLine("Word Raporu yaratıldı:{0}",bilgi); 
     } 

    } 

    class ExcellRaporu : IReport 
    { 
     public void RaporYarat(string bilgi) 
     { 
      Console.WriteLine("Excell raporu yaratıldı:{0}",bilgi); 
     } 
} 

    class PdfRaporu : IReport 
    { 
     public void RaporYarat(string bilgi) 
     { 
     Console.WriteLine("pdf raporu yaratıldı:{0}",bilgi); 
     } 
} 
}

Deuxième toutes les instances 0ne genareted de la classe normale

namespace Single_Responsibility_Principle_3 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      WordRaporu word = new WordRaporu(); 
      ReportManager manager = new ReportManager(); 
      manager.RaporHazırla(word,"test"); 
     } 
    } 
     interface IReportManager 
    { 
     void RaporHazırla(IReport rapor, string bilgi); 
    } 

    class ReportManager : IReportManager 
    { 
     public void RaporHazırla(IReport rapor, string bilgi) 
     { 
      rapor.RaporYarat(bilgi); 
     } 
    } 


    interface IReport 
    { 
     void RaporYarat(string bilgi); 
    } 

    class WordRaporu : IReport 
    { 
     public void RaporYarat(string bilgi) 
     { 
      Console.WriteLine("Word Raporu yaratıldı:{0}",bilgi); 
     } 

    } 

    class ExcellRaporu : IReport 
    { 
     public void RaporYarat(string bilgi) 
     { 
      Console.WriteLine("Excell raporu yaratıldı:{0}",bilgi); 
     } 
} 

    class PdfRaporu : IReport 
    { 
     public void RaporYarat(string bilgi) 
     { 
     Console.WriteLine("pdf raporu yaratıldı:{0}",bilgi); 
     } 
} 
} 

Répondre

4

Votre exemple ne pas lié à SRP. Il se rapporte à un autre principe OO que "Program To Interfaces". Je recommande d'aller pour la première mise en œuvre. SRP indique que la classe ne devrait avoir qu'une seule raison de changer. Dans votre cas, vous avez deux objets distincts, ReportManager et Report. Ainsi, conformément à SRP, ReportManager ne devrait être responsable que de la gestion des instances de rapports et le rapport devrait être responsable de la création de rapports. ReportManager peut être mis à l'échelle pour contenir des informations sur les différents types d'implémentation de rapports disponibles en configuration et peut également prendre la responsabilité de créer les instances à un moment donné.

+0

Il y a aussi le "principe de substitution de Liskov", qui est proche de "Program to interfaces". – ewernli