- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在尝试找出设计我的程序功能的最佳方法。
该程序的主要组成部分是 Camera 类。这个 Camera 对象表示真实相机的程序用户界面,它通过图像采集卡连接到计算机。相机类可以链接到图像采集卡、开始和停止采集,还可以改变/访问许多不同的相机属性。当我说很多时,我指的是超过 250 个独特的命令。通过帧捕获器向物理相机发送串行字符串,向相机发出每个独特的命令。每个命令都可以被认为是三种类型之一。一个操作、一个查询和一个值。
Action 命令是不需要等号的东西,例如“重置”、“打开”、“关闭”
查询是您可以获得但不能设置的东西,它通常与一个值相关联。例如“temperature=?”、“sernum=?”、“maxframerate=?”命令会导致相机发回信息。这些值无法更改,因此“temperature=20”会导致错误。
值是您可以获取和设置的通常与值相关联的东西。例如“framerate=30”和“framerate=?”是两个独特的命令,但我认为基本字符串“framerate”是一个值命令类型,因为它既可以变异也可以访问。
250 个独特的命令可以减少到约 100 个 CameraActions、CameraQuerys 和 CameraValues。在我的 Camera 类中没有 250 个方法,我有一个想法来组合命令对象而不是单独的 setter、getter 和 Action 。命令字符串可以在构造函数中提供,或者用 setter 重置。然后我可以编写一个包含所有可用命令的 CameraCommands 对象,并将其作为公共(public)成员提供给我的相机。
//CameraAction.h =============================================
class CameraAction {
public:
CameraAction(std::string commandString, SerialInterface* serialInterface);
void operator()() { _serialInterface->sendString(_commandString); }
private:
SerialInterface* _serialInterface;
std::string _commandString;
};
//CameraValue.h =====================================================
class CameraValue {
public:
CameraValue(std::string commandString, double min, double max, SerialInterface* serialInterface);
void set(double value)
{
if(value > _maxValue) { throw std::runtime_error("value too high"); }
if(value < _minValue) { throw std::runtime_error("value too low"); }
std::string valueString = std::to_string(value);
_serialInterface->sendString(_commandString + "=" + valueString);
}
double get()
{
std::string valueString = _serialInterface->sendString(_commandString + "=?");
return atof(valueString.c_str());
}
private:
SerialInterface* _serialInterface;
std::string _commandString;
double _minValue;
double _maxValue;
};
//CameraCommands.h ===================================================
class CameraCommands {
public:
CameraCommands();
CameraAction reset;
CameraQuery temperature;
CameraValue framerate;
CameraValue sensitivity;
//... >100 more of these guys
};
//Camera.h ===========================================================
class Camera {
public:
Camera();
CameraCommands cmd;
void startAcquisition();
void stopAcquisition();
void setDataBuffer(void* buffer);
void setOtherThing(int thing);
};
这样用户就可以做类似的事情:
Camera myCamera;
myCamera.cmd.reset();
myCamera.cmd.framerate.set(30);
myCamera.cmd.sensitivity.set(95);
double temperature = myCamera.cmd.temperature.get();
myCamera.startAcquisition();
等...
这里的主要问题是我公开了公共(public)成员变量,这应该是一个巨大的禁忌。我当前的对象设计是否合乎逻辑,或者我应该简单地实现 250 个 setter 和 getter 以及 100 个以上的 setter 和 getter 来改变最小和最大可设置值。
这对我来说似乎很麻烦,因为还有许多与 Camera 对象关联的 setter/getter 与用户命令无关。用户界面最好为用户提供方法 (cmd) 的范围,以了解某些东西是在相机中发生物理变化,还是只是在编程对象(其他方法)中发生变化。有没有更好的方法来设计我的程序?
最佳答案
您基本上描述了一个有趣的层次结构:
命令
-> 查询
-> 值
。
Command
包含作为命令文本的字符串;它还可以提供一个 protected
Send()
方法供其子级调用。Query
还包含一个(protected
)int
变量(或其他变量),您可以通过 get()
和/或 operator int()
立即,或 query()
来自相机;Value
将 set()
和/或 operator =(int)
命令添加到 Query
。 Value
的构造函数(特别是)可以有 min
和 max
,正如您所描述的。
Camera
对象可以有多个 public
成员:
class Camera {
private: // Classes that no-one else can have!
class Command; friend Command;
#include "Camera.Command.inc"
class Query; friend Query;
#include "Camera.Query.inc"
class Value; friend Value;
#include "Camera.Value.inc"
public: // Variables using above classes
Command reset;
Command open; // Maybe make this one private, for friends?
Command close; // Ditto?
Query temperature;
Query sernum;
Query maxFrameRate;
Value frameRate;
private: // Variables
SerialPort port; // Allow Command and co. access to this
}; // Camera
这样组织起来,那么:
query()
和 set()
方法隐藏了与物理相机交互的机制。您会注意到我在 Camera
类的中间添加了 #include "Camera.XXX.inc"
。注意:
.inc
扩展名,因为它们“包含”在 .h
文件中:它们不是独立的头文件。关于c++ - 具有公共(public)成员对象的类组合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37838290/
我有一个 mysql 表,其中包含一些随机数字组合。为简单起见,以下表为例: index|n1|n2|n3 1 1 2 3 2 4 10 32 3 3 10 4 4
我有以下代码: SELECT sdd.sd_doc_classification, sdd.sd_title, sdd.sd_desc, sdr.sd_upl
如果我有两个要合并的数据框 Date RollingSTD 01/06/2012 0.16 01/07/2012 0.18 01/08/2012 0.17 01/09/20
我知道可以使用 lein ring war 创建一个 war 文件,但它似乎仍然包含码头依赖项。当我构建 war (并在 tomcat 上部署)时,有没有办法排除码头依赖项? 如果我根本不能做这件事,
维基百科关于封装的文章指出: “封装还通过防止用户将组件的内部数据设置为无效或不一致的状态来保护组件的完整性” 我在一个论坛上开始讨论封装,在那里我问你是否应该始终在 setter 和/或 gette
对于我使用的组合框内的复选框: AOEDComboAssociationName = new Ext.form.ComboBox({ id: 'AOEDComboAssociationName',
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: How do I combine LINQ expressions into one? public boo
如何在 rust 中找到排列或组合的数量? 例如C(10,6) = 210 我在标准库中找不到这个函数,也找不到那里的阶乘运算符(这就足够了)。 最佳答案 以@vallentin 的回答为基础,可以进
我有一个复杂的泛型类型用例,已在下面进行了简化 trait A class AB extends A{ val v = 10 } trait X[T<:A]{ def request: T }
如何使用 Hibernate 限制来实现此目的? (((A='X') and (B in('X',Y))) or ((A='Y') and (B='Z'))) 最佳答案 思考有效 Criteria c
我一定会在我的一个项目中使用谷歌图表。我需要的是,显示一个条形图,并且在条形图中,与每个条形相交的线代表另一个值。如果您查看下面的 jsfiddle,您会发现折线图仅与中间的条形图相交,并继续向其他条
只是一个简单的问题,我也很想得到答案,因为我不能百分百理解 Javascript 示例:假设您提示用户输入名称。够简单吧?但是你有一个数组,上面写着一些名字(其中之一就是),基本上就是我到目前为止所说
我试图通过 Haskell 理解函数式编程,但在处理函数组合时遇到了很多麻烦。 其实我有这两个功能: add:: Integer -> Integer -> Integer add x y = x
我正在寻找一种在 Realm 查询中组合 AND 和 OR 的方法。 这是我的课: class Event extends RealmObject { String id; String
例如,我有一个包含 5 个元素的哈希: my_hash = {a: 'qwe', b: 'zcx', c: 'dss', d: 'ccc', e: 'www' } 我的目标是每次循环哈希时都返回,但没
我是Combine 的新手,我想得到一个看似简单的东西。假设我有一个整数集合,例如: let myCollection = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 我想以例如 0
关于“优先组合而不是继承”的问题,我的老师是这样说的: 组合:现有类成为新类的组件 转发:新类中的每个实例方法,在现有类的包含实例上调用相应的方法并返回结果 包装器:新类封装了现有的 这三个概念我不是
我正在尝试将单个整数从 ASCII 值转换为 0 和 1。相关代码如下所示: int num1 = bin.charAt(0); int num2 = bin.charAt(1);
这个问题已经有答案了: What is a NullPointerException, and how do I fix it? (12 个回答) 已关闭 7 年前。 我经常看到“嵌套”类中的非静态变
我尝试合并两个数据集(DataFrame),如下所示: D1 = pd.DataFrame({'Village':['Ampil','Ampil','Ampil','Bachey','Bachey',
我是一名优秀的程序员,十分优秀!