关于组织班级成员的最佳方法的任何意见(尤指)。在C++中有很多)。特别是,一个类有大量的用户参数,例如一个优化某些函数的类,它有一些参数,如迭代#、优化步骤的大小、使用的具体方法、优化函数权重等。我尝试了几种常用的方法,似乎总是发现一些不理想的东西。只是好奇别人的经历。
更确切地说,我正在处理的代码在一系列图像中跟踪对象。因此,一个重要的方面是,它需要保持帧之间的状态(为什么我不只是做了一堆函数)。重要的成员函数包括initTrack()、trackFromLastFrame()、isTrackValid()。还有一组用户参数(例如,跟踪每个被跟踪对象的点数、在帧之间移动多少点、所使用的跟踪方法等)。
发布于 2010-10-26 15:34:25
如果您的类是,那么您的类就是BAD。类应该尊重单一责任原则,即:类只应该做一件事情,但应该做得很好。(“只有一件事”是极端的,但它应该只有一个角色,而且它必须得到明确的执行)。
然后,用那些单角色的小类创建类,通过组合来丰富这些类,每个类都有一个清晰而简单的角色。
大型函数和大类是bug、误解和不必要的副作用(特别是在维护期间)的巢穴,因为没有人可以在700行代码中学习。
因此,对于大类的策略是:重构,组合,小类只在他们所做的事情上拖拉。
发布于 2010-10-25 20:24:51
如果我必须选择您列出的四种解决方案中的一种:类中的私有类。
在现实中:您可能有重复的代码,这些代码应该被重用,您的类应该被重新组织成更小、更逻辑和更可重用的部分。正如GMan所说:重构您的代码
发布于 2010-10-26 16:54:11
首先,我将成员划分为两个集合:(1)那些内部只使用的,(2)用户将调整以控制类的行为的集合。第一组应该是私有成员变量。
如果第二个集合很大(或者因为您仍然在进行主动开发而不断增长和变化),那么您可能会将它们放入自己的类或结构中。然后,主类将有两个方法,GetTrackingParameters和SetTrackingParameters。构造函数将建立默认值。然后,用户可以调用GetTrackingParameters,进行更改,然后调用SetTrackingParameters。现在,当您添加或删除参数时,您的接口将保持不变。
如果参数是简单的和正交的,那么它们可以被包装在一个具有良好名称的公共成员的结构中。如果必须强制执行约束,特别是组合约束,那么我会将参数实现为一个类,其中包含每个参数的getter和setter。
ObjectTracker tracker; // invokes constructor which gets default params
TrackerParams params = tracker.GetTrackingParameters();
params.number_of_objects_to_track = 3;
params.other_tracking_option = kHighestPrecision;
tracker.SetTrackingParameters(params);
// Now start tracking.如果您稍后发明了一个新参数,您只需要在TrackerParams中声明一个新成员并在ObjectTracker的构造函数中初始化它。
https://stackoverflow.com/questions/4018464
复制相似问题