将非结构化重复代码重构为可重用组件的提示

时间:2011-01-20 00:00:40

标签: c# design-patterns

我搜索过并搜索过,无法得到任何相关答案。希望有人可以提供帮助。

我开始将类编写为一种单元保持数据,另一个用于从数据库填充类的util类。嗯,对于一个小代码库来说,这似乎不是一个大问题,但是期待并且让我成长为一个能够充分掌握面向对象设计和开发的合格开发人员,我需要将其发展成一个合适的设计

让我们从初始课开始

public class Foo
{
   public int FooID {get;set;}
   public string FooName {get;set;}
   public string FooDescription {get;set;}
}

public class NotRelatedToFoo
{
   public int SomeID {get;set;}
   public string SomeName {get;set;}
   public string SomeDescription {get;set;}
}


public class Util
{
   public Util(){} 

   public List<NotRelatedToFoo> GetNotRelatedToFoos(string SomeName)
   {
     .... DB Code to return Data from DB 

     List<NotRelatedToFoo> notfoos = new List<NotRelatedToFoo>()
     (select * from NotRelatedToFoo where SomeName like @SomeName)
     foreach var item in db
     {
       NotRelatedToFoo notfoo = new NotRelatedToFoo ();
       notfoo.SomeID = item.SomeID;
       notfoo.SomeName = item.SomeName
       notfoo.SomeDescription = item.SomeDescription 
       notfoos.Add(notfoo);
      }
      return notfoos ;
   }

}

我的问题是从这个设计前进的最佳方法是什么。

修改 目前Util类是一个大混乱,我需要建议如何提取和分组功能一起按照结构化设计

这不起作用,或者可以

public class Foo
{
   public int FooID {get;set;}
   public string FooName {get;set;}
   public string FooDescription {get;set;}

   public List<Foo> GetFoos(string FooName)
   {
     .... DB Code to return Data from DB 

     List<Foo> foos = new List<Foo>()
     (select * from foo where FooName like @FooName)
     foreach var item in db
     {
       Foo foo = new Foo();
       foo.FooID = item.FoodID;
       foo.FooName = item.FooName
       foo.FooDescription = item.FooDescription 
       foos.Add(foo);
      }
      return foos;
   }
}

由于

3 个答案:

答案 0 :(得分:4)

  

我的问题是从这个设计中向前迈进的最佳方式是什么。

名为UtilManager的类或者您通常具有设计气味的类。您应该能够描述该类正在做什么(它应该只有一个责任),并且应该是该类的名称。如果你必须使用通用的,模糊的,包含所有的术语来描述类正在做什么,那么你做错了什么,重新设计是有序的。

你的Util课程做得太多了。它从数据库获取两种不同类型的数据。通过这种方式设计您的课程,您可能会违反开放/封闭原则(每次向模型添加新类型时都必须修改此类)。

至少,您需要单独的类才能从数据库中获取FooNotRelatedToFoo。 <怎么样

abstract class Repository<T> {
     IEnumerable<T> GetAll();
}

abstract class SqlRepository<T> : Repository<T> {
    protected readonly SqlConnection connection;
    public SqlRepository(SqlConnection connection) {
        this.connection = connection;
    }
}

class FooRepository : SqlRepository<T> {

    public FooRepository(SqlConnection connection) : base(connection) { }

    public IEnumerable<T> GetAll() {
    }
}

等。真正令人不舒服的是,您甚至可以解除许多重复的代码,将对象从IDataReader保湿到公共类(提示:第一个版本将使用反射)。

除此之外,请阅读SOLID。如果您真的想深入了解它,请尝试模式企业应用程序架构(Fowler)和设计模式(Gamma等人)

答案 1 :(得分:0)

访问数据库的常用方法是通过数据访问对象。 http://java.sun.com/blueprints/corej2eepatterns/Patterns/DataAccessObject.html

不知道,如果你有其他类用于持久化,更新或删除数据,但我通常通过DAO进行CRUD操作。

答案 2 :(得分:0)

你的Util课程负责很多事情(正如Jason先前指出的那样)。

尽管如此,Util正试图成为FooUnrelatedToFoo个对象的存储库。

我个人会将这一点抽象为一些继承结构和引入泛型。

如果您要创建大量以重复和基于约定的方式映射到数据库表的POCO对象,请考虑使用带有FluentNHibernate映射的ORM,例如NHibernate。