gpt4 book ai didi

oop - 面向对象的设计

转载 作者:行者123 更新时间:2023-12-03 07:21:52 26 4
gpt4 key购买 nike

我有两个 csv 文件 A 和 B。A 是主存储库。我需要读取这些文件,将 B 的记录映射到 A 并将映射的记录保存到另一个文件。保存记录的类是 Record。保存匹配记录的类是 RecordMatch。

class Record
{
string Id;
string Name;
string Address;
string City;
string State;
string Zipcode;
}

class RecordMatch
{
string Aid;
string AName;
string Bid;
string BName;
double NameMatchPercent;
}

映射场景如下:首先,针对 B 的每条记录,使用州、城市和邮政编码过滤 A 的记录。然后将过滤后的 A 记录与 B 记录进行比较。这种比较是在名称字段之间进行的,并且是使用模糊字符串算法的最佳匹配比较。选择并保存最佳匹配。

字符串匹配算法将给出匹配的百分比。因此,必须从所有比赛中选择最好的结果。

现在我已经尽力解释了这个场景,接下来我将讨论设计问题。我最初的设计是创建一个 Mapper 类,如下所示:

class Mapper
{
List<Record> ReadFromFile(File);
List<Record> FilterData(FilterType);
void Save(List<Record>);
RecordMatch MatchRecord(Record A, Record B);
}

但是从设计来看,它似乎只是某些方法的类包装器。我在其中没有看到任何面向对象的设计。我还觉得 Match() 更属于 Record 类而不是 Mapper 类。

但从另一个角度来看,我看到该类实现了类似于存储库模式的东西。

我认为的另一种方法是保留 Mapper 类,并将 Match() 方法移至 Record 类,如下所示:

class Mapper
{
List<Record> ReadFromFile(File);
List<Record> FilterData(FilterType);
void Save(List<Record>);
}

class Record
{
string id;
string name;
string address;
// other fields;

public RecordMatch Match (Record record)
{
// This record will compare the name field with that of the passed Record.
// It will return RecordMatch specifyin the percent of match.
}
}

现在我对这个简单的场景感到完全困惑。在这种情况下,理想的良好面向对象设计应该是什么样的?

最佳答案

有趣的是,我现在正在从事一个几乎与此完全相同的项目。

简单回答:好的,首先,如果一个方法暂时处于错误的类中,那并不是世界末日!如果您的类都包含测试,那么函数所在的位置很重要,但可以根据您(领域之王)认为合适的方式进行流畅更改。

如果您对此进行测试,那么,这将是我的第一个建议。许多比我聪明的人都谈到了 TDD 和测试如何帮助您的类自然地达到最佳设计。

更长的答案:我不喜欢寻找适用于设计的模式,而是喜欢这样思考:每个类必须改变的原因是什么?如果您将这些原因分开(这是 TDD 可以帮助您做的一件事),那么您将开始看到设计模式自然地从您的代码中出现。

以下是我在阅读您的问题后可以想到的一些更改原因:

  1. 数据文件更改格式/添加列
  2. 您找到了更好的匹配算法,或者:“现在我们也想过滤手机号码”
  3. 系统会要求您使其与 xml/yaml/etc 文件匹配
  4. 系统会要求您将其保存为新格式/位置

好吧,所以,如果实现其中任何一个都需要在某处添加“if 语句”,那么这可能是实现公共(public)接口(interface)的子类的接缝。

此外,假设您要将创建的文件保存在新位置。这是改变的原因之一,并且不应与您需要改变合并策略的情况重叠。如果这两个部分位于同一个类中,则该类现在有两个职责,这违反了 single responsibility principle

这是一个非常简短的示例,要进一步深入了解良好的 OO 设计,请查看 SOLID principles 。学习这些内容并在整个面向对象设计中谨慎应用它们是不会出错的。

关于oop - 面向对象的设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7415139/

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