单一责任原则用法如何正确调用子方法?

时间:2010-05-29 08:36:30

标签: c# .net visual-studio oop design-patterns

我尝试学习SOLID易思考。我写了两种代码风格。哪一个是:
1)单一责任原则_2.cs:如果你看主程序从界面
生成的所有实例 1)单一责任原则_3.cs:如果您查看主程序,所有实例都是从正常类中生成的
我的问题:哪一个是正确用法?我更喜欢哪一个?

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);
       }
}
}

第二个所有实例都来自正常班级

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);
       }
}
}

1 个答案:

答案 0 :(得分:4)

您的示例与SRP无关。它涉及“程序到接口”的另一个OO原则。我建议先进行实施。

SRP说,班级应该只有一个改变的理由。在您的情况下,您有两个不同的对象,ReportManager和Report。因此,根据SRP,ReportManager应仅负责管理报告实例,报告应负责报告目的。 ReportManager可以扩展以包含有关作为配置可用的各种类型的报告实现的信息,并且可能还负责在某个时间创建实例。