考虑一个从外部源摄取对象并执行大量处理的处理系统。一个例子是计算机视觉系统检测到的物体,然后将其输入到安全警报系统中,以查找特定的运动行为和异常定位。
外部对象提供其在其首选参考系中的位置。我的代码需要将该位置转换为与处理系统一致的位置。
一种面向对象的方法是构建一个“重”包装类,在内部转换位置。很重,因为它包含或调用转换代码,而不是盲目地传递外部对象字段。这里的好处是可以实现独立的缓存。
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 更具可扩展性,但是需要考虑哪些因素以及通常来说,确定一组数据是否应该对象化和包装的好方法是什么,或者构建一个可用于构建处理框架的可扩展性是否更高。随着更多字段的添加和删除,可以轻松调整吗?
这是Machinet AI的回应:
在决定采用面向对象 (OO) 方法还是函数式编程 (FP) 方法来解决转换对象位置等问题时,需要牢记一些注意事项:
在提供的伪代码示例中,OO 方法使用包装类来封装转换逻辑,而 FP 方法使用静态函数。这两种方法都可以根据您系统的具体要求而工作。
要确定解决您问题的最佳方法,请考虑转换逻辑的复杂性、可重用性、可扩展性和性能要求。与您的团队或领域专家讨论设计选择以收集不同的观点并做出明智的决定也可能会有所帮助。
请记住,没有一刀切的解决方案,最佳方法可能会根据项目的具体情况和要求而有所不同。