gpt4 book ai didi

c# - 将非结构化重复代码重构为可重用组件的技巧

转载 作者:行者123 更新时间:2023-11-30 21:17:31 26 4
gpt4 key购买 nike

我查了又查,没有得到任何相关的答案。希望有人能提供帮助。

我开始编写类作为一种单元保存数据和另一个实用程序类来从数据库中填充类。好吧,对于小型代码库来说,这似乎不是什么大问题,但期待着我成长为一名对面向对象的设计和开发有扎实把握的称职开发人员,我需要将其发展为适当的设计

让我们从初始类开始

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

谢谢

最佳答案

My question is what is the best way to move forward from this design.

名为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 et al.)

关于c# - 将非结构化重复代码重构为可重用组件的技巧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4742160/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com