Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在OOP中,将某些属性值从一个对象传递到另一个对象的最佳方式是什么?_Oop_Design Patterns - Fatal编程技术网

在OOP中,将某些属性值从一个对象传递到另一个对象的最佳方式是什么?

在OOP中,将某些属性值从一个对象传递到另一个对象的最佳方式是什么?,oop,design-patterns,Oop,Design Patterns,考虑从B类实例化的a类。B类要求从a类实例获得某些值。从实体或其他设计原则来看,将这些值从a传递到B的最佳实践是什么: 通过将A的整个实例传递给B的构造函数 只需将必要的属性值从A的实例传递给B的构造函数 视情况而定 对于第(3)种情况,哪种标准会支持一种或另一种解决方案 (我不知道这是否会对可能的答案产生影响,但我正在用Python编写代码)我认为您遗漏了一个答案,而实际上这是最常见的一个 将整个对象的引用传递给B,B保存引用,或复制构造期间所需的值 根据对象之间的关系,两者都可以接受 对于实

考虑从B类实例化的a类。B类要求从a类实例获得某些值。从实体或其他设计原则来看,将这些值从a传递到B的最佳实践是什么:

  • 通过将A的整个实例传递给B的构造函数
  • 只需将必要的属性值从A的实例传递给B的构造函数
  • 视情况而定
  • 对于第(3)种情况,哪种标准会支持一种或另一种解决方案

    (我不知道这是否会对可能的答案产生影响,但我正在用Python编写代码)

    我认为您遗漏了一个答案,而实际上这是最常见的一个

    将整个对象的引用传递给B,B保存引用,或复制构造期间所需的值

    根据对象之间的关系,两者都可以接受

    对于实例化A不需要B的情况,您的解决方案#2很常见——也就是说,它可以由具有等效值的C实例化,甚至可以通过编程方式从输入值或运行时计算的值实例化


    不管它值多少钱,我通常使用#2,但如果我通常基于B构造,我将创建一个特殊的构造函数fascade,它接受B并将所需的值收集到主构造函数中。

    这是一个开放的问题,我会说这取决于情况。由于您明确地说B将从A实例化,因此我假设Dependency注入(SOLID中的D)是不可能的。然后,除了尽可能保持代码整洁的总体目标外,我将重点讨论Ssingle responsibility原则

    需要考虑以下几点:

    • B实际需要多少个“值”?如果B只需要一个或两个简单的值,那么我会将它们作为参数传递进来,以保持其干净和简单。如果它需要的不止这些,那么您可以将整个A(或对它的引用)作为参数传入,并让B从中选择它需要的内容,或者创建另一个类(C?),该类正好包含所需的值。这将保持B的构造函数签名相当干净,并减少添加/更改传递到其中的数据的负担(与修改B的签名以及对它的所有调用相比,在以后修改C可能更容易,也不那么麻烦)

    • B将在何处使用?如果它只被A使用,那么让B根据需要直接从A获取数据可能是有意义的。如果它将被其他地方和其他类使用,那么最好最小化对的任何依赖,并确保它从一开始就拥有所需的一切。如果B有可能需要通过网络等进行序列化、存储或发送,这也适用,因为它可能无法访问a

    最佳解决方案将因上下文而异。例如,您可能会想到处理Windows桌面应用程序GUI的两个紧密耦合的类与服务体系结构中的两个类之间的区别,其中一个或两个类可能包含要传输或存储在数据库中的数据