OO 与 FP:理解是否应该使用重型包装类的好方法是什么?

问题描述 投票:0回答:1

考虑一个从外部源摄取对象并执行大量处理的处理系统。一个例子是计算机视觉系统检测到的物体,然后将其输入到安全警报系统中,以查找特定的运动行为和异常定位。

外部对象提供其在其首选参考系中的位置。我的代码需要将该位置转换为与处理系统一致的位置。

一种面向对象的方法是构建一个“重”包装类,在内部转换位置。很重,因为它包含或调用转换代码,而不是盲目地传递外部对象字段。这里的好处是可以实现独立的缓存。

FP 方法是构建一个静态函数,它接受对象并计算变换后的位置。如果多次调用此函数,则缓存计算的位置可能是有意义的,并且在 FP 世界中,缓存的位置将属于单独的查找结构。

这是一些 Python 伪代码:

面向对象的方法:

import visionlib as v

class WrappedObject:
    def __init__(self, external_object):
        self.position = Utils.transform_frame_a_to_b(external_object.get_position())
    def get_position(self):
        return self.position

def get_objects_in_frame():
    return [WrappedObject(obj) for obj in v.get_sensed_objects()]

def update_tracks(object_list):  # from ()

    # Lots of loops, specialized processing, optimization, statistical calculations, etc.
    # Calls WrappedObject.get_position() thousands of times per frame
    ...
        ...
        pos = obj.get_position()
        ...
    return object_tracks

# Call
tracks = update_tracks(get_objects_in_frame())

功能性方法:

import visionlib as v

class WrappedObject:
    def __init__(self, external_object):
        self.obj = external_object
    def get_position_in_frame_a(self):
        return self.obj.get_position()

def get_objects_in_frame():
    return [WrappedObject(obj) for obj in v.get_sensed_objects()]

def get_object_positions(object_list):
    return dict([obj.id, Utils.transform_frame_a_to_b(obj.get_position_in_frame_a())
                for obj in object_list])

def update_tracks(object_list, object_positions):

    # Lots of loops, specialized processing, optimization, statistical calculations, etc.
    # Calls WrappedObject.get_position() thousands of times per frame
    ...
        ...
        pos = object_positions[obj.id]
        ...
    return object_tracks

# Call
object_list = get_objects_in_frame()
object_positions = get_object_positions()
tracks = update_tracks(object_list, object_positions)

如何解决这个问题?两种解决方案都有效,并且 FP 更具可扩展性,但是需要考虑哪些因素以及通常来说,确定一组数据是否应该对象化和包装的好方法是什么,或者构建一个可用于构建处理框架的可扩展性是否更高。随着更多字段的添加和删除,可以轻松调整吗?

python oop functional-programming
1个回答
0
投票

这是Machinet AI的回应:

在决定采用面向对象 (OO) 方法还是函数式编程 (FP) 方法来解决转换对象位置等问题时,需要牢记一些注意事项:

  1. 复杂性和可维护性:如果转换逻辑复杂并且涉及多个步骤或依赖关系,带有包装类的面向对象方法可以提供更可维护和更有组织的解决方案。包装类封装了转换逻辑,方便以后理解和修改。
  2. 可重用性:如果需要在代码库的多个部分重用转换逻辑,则带有包装类的面向对象方法可能会很有用。包装类可以在代码的不同部分实例化,从而允许代码重用,而无需重复转换逻辑。
  3. 可扩展性:如果转换逻辑简单并且没有太多依赖项,则具有静态函数的函数方法可以更具可扩展性。可以从代码的不同部分轻松调用转换函数,而无需实例化包装对象。
  4. 性能:如果性能是一个关键因素,并且每帧需要调用转换逻辑数千次,那么缓存计算的位置可以提高性能。 OO 和 FP 方法都可以实现缓存,但实现细节可能有所不同。在决定缓存机制时,请考虑系统的具体要求和性能限制。

在提供的伪代码示例中,OO 方法使用包装类来封装转换逻辑,而 FP 方法使用静态函数。这两种方法都可以根据您系统的具体要求而工作。

要确定解决您问题的最佳方法,请考虑转换逻辑的复杂性、可重用性、可扩展性和性能要求。与您的团队或领域专家讨论设计选择以收集不同的观点并做出明智的决定也可能会有所帮助。

请记住,没有一刀切的解决方案,最佳方法可能会根据项目的具体情况和要求而有所不同。

© www.soinside.com 2019 - 2024. All rights reserved.