我们有一个包含数据和方法的实体(类)(我们称之为 Person)。还有其他类需要使用此对象中的数据(我们称其中之一为 Accountant),但不需要使用其方法中的功能。
将整个 Person 对象发送给 Accountant 还是创建一个新的 PersonData 对象来保存数据并将其发送给 Accountant obj 会更好吗?
我们确实有一个案例需要解决这个问题,但我想知道最好的一般答案,以便我们可以在整个过程中使用它。
我们有一个包含数据和方法的实体(类)(我们称之为 Person)。还有其他类需要使用此对象中的数据(我们称其中之一为 Accountant),但不需要使用其方法中的功能。
将整个 Person 对象发送给 Accountant 还是创建一个新的 PersonData 对象来保存数据并将其发送给 Accountant obj 会更好吗?
我们确实有一个案例需要解决这个问题,但我想知道最好的一般答案,以便我们可以在整个过程中使用它。
通常,您会在需要以某种序列化形式使用数据的地方移交 DTO——例如通过 Web 服务或智能客户端。如果您只是在域中使用 Person 对象,并且已经正确封装,为什么还要努力创建 DTO?
正如其他人所说,使用 DTO 没有任何意义,除非不涉及转移...... :)
我建议的解决方案是将传递给Accountant
接口的对象抽象IAccountee
并Person
实现它......我不熟悉C#(从你的个人资料中,我推断这是你选择的语言:)),但是这个可能应该为您指明正确的方向:
class Accountant {
//....
public void performAction(IAccountee target)
{
}
}
interface IAccountee
{
string Name
{
get;
}
int Salary
{
get;
set;
}
}
class Person : IAccountee
{
//implementation here, as well as some stuff specific to Person
}
基本上,这就是SOLID中的D :) ...它既灵活又干净,还避免了与...共享不必要的信息Person
Accountant
据我了解,C# 接口不能需要变量(如在大多数语言中一样),这会迫使您创建访问器(除非有一些语言/IDE 功能可以生成默认的普通访问器),如果您还没有这样做的话......它比使用普通变量更耗时,并且需要比普通字段访问更多的性能,但是 OTOH,这也是我认为好的做法,至少当事情没有得到性能时......我认为这绝对是比创建额外的 DTO 类和来回复制数据(或至少在一个方向上)更优雅......
希望对您有所帮助... ;)
我会说 OOP 会让你使用在 person 类中定义的“get”方法。我不会发送整个对象,因为会计不需要整个对象,只需要选择性数据。我不会说后者,因为您正在创建不必要的大量冗余。
但是像这样的 OOP 是高度理想化的,所以换一种方式可能会更好......
我通常保留使用 DTO 进行数据的跨层传输。如果不是这种情况,我不确定创建一个令人信服的理由。
我认为这是一个信任边界的问题。在业务应用程序中,信任边界通常决定了您的层架构。如果您的“会计师”在 Person 的信任边界之外,那么应该进行某种模型转换。架构和需求应该决定什么样的转换。