- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我一直在努力让自己的注意力集中在类里面。即使在阅读了几个网站和书籍之后,我仍然不觉得我真的“明白”了。
我正在处理的应用程序有一个 sub,它将通过 USB 到 GPIB 接口(interface)控制几个不同的测试设备。
所以,我有:
Laptop USB - GPIB Interface Power Supply (Device Address 5) HP34970 Datalogger (Device Address 6)
在我的潜艇中,我想打开 GPIB 设备,发送一些 SCPI 命令以打开电源,再发送一些命令到 HP34970 以切换继电器或测量电压。
看起来很简单,我可以很容易地让所有东西都在同一个模块中工作。然而,我认为为 GPIB 接口(interface)、电源和 HP34970 提供一个单独的类会好得多。如果是这样的话,我可以很容易地在其他项目中重用代码。
这是我无法获得心智模型的地方——如果我创建了 GPIB 类的实例并有一个方法来“打开”到 GPIB 总线的 channel ,我如何允许其他类中的方法(比如电源)使用在 GPIB 类中创建的开放 channel ?例如电源类中设置电压的方法。
如果有人可以花几分钟时间发布伪代码和一些解释来说明我可以/应该如何组织它,我将不胜感激!
谢谢
最佳答案
将类视为设备本身。这里的主要好处是能够重用一次编写的代码——例如,你所有的设备都有地址,它们可以连接、测试连接、断开连接——为什么不把它放在一个抽象的“设备”类中,并使所有设备从中继承?
这可能是其中一种用法 - 用 C# 编写(抱歉,如果我误解了实际用法:) 这里我假设电源和 dataLogger 连接到接口(interface),接口(interface)连接到笔记本电脑)。
public class DeviceTesting
{
private string powerSupplyAddress = "DA5";
private string dataLoggerAddress = "DA6";
public static void main()
{
//bring interface into life
DeviceInterface interface = GPIBInterface(); //example of inheritance - GPIB could be just one of the many device interfaces
//the constructor in PowerSupply takes on the responsibility of initializing itself
PowerSupply ps = new PowerSupply(powerSupplyAddress, interface); //plugged in with interface - has a reference to it
//you could have multiple types of data loggers - all could inherit from DataLogger, and here so does HP34970
//This means you can reuse the common code for data loggers, and write only the specifics for each specific device of that kind
DataLogger myLogger = new HP34970(dataLoggerAddress, interface);
//now, do whatever you do with the real devices
ps.SetVoltage(220); //send voltage command directly
interface.SendLogMessage("Interface is operational");
interface.ExecuteTest("test1"); //send voltage command through interface
//etc... you get the idea...
}
}
现在,由于接口(interface)知道它所连接的设备,它必须将它们包含在它的构造函数中(在面向对象的设计中,也称为依赖注入(inject),更具体地说,这里是构造函数注入(inject)):
public GPIBInterface : DeviceInterface //here we are reusing code that's same for all interfaces
{
//whoever attaches to this interface is responsible for registering itself with it
public PowerSupply Power{get;set;}
public DataLogger Logger{get;set;}
//notice here that it can work with any class that inherits from DataLogger
public GPIBInterface()
{
}
private override void TestInitialization() //as an example, we write our own testing by overriding some method in base class
{
base.TestInitialization(); //make sure that the base class checks it's ok - e.g. if it's own display is working or similar...
if (Power.TestConnection() == false)
throw new DeviceNotWorkingException(ps);
if (Logger.TestConnection() == false)
throw new DeviceNotWorkingException(_logger);
}
public void SendLogMessage(string message)
{
Logger.SendMessage(message);
}
public void ExecuteTest(string testName)
{
switch(testName)
{
case "test1":
Power.SetVoltage(280);
Logger.SendMessage("Voltage increased to 280V");
break;
}
}
}
基本上,如果您的设备在“现实生活”中相互交互,则这意味着它们应该具有对所连接的其他设备的引用。例如,如果您将 PowerSupply 直接插入到 logger,那么 PowerSupply 类应该有对 logger 的引用。但是,如果它连接到接口(interface),然后连接到记录器,电源必须只引用接口(interface)而不是记录器(因为它没有连接到它)。
我希望你明白这个想法——它并不是无缘无故地被称为“面向对象”——将类视为真实的对象——如果一个对象可以做 thing1,那么你应该在你的类中有方法“thing1()”;如果对象与 object441 有连接,那么该类应该有对该类的引用。只要遵循这个原则,看看它会把你带到哪里......
当你掌握它时,你的程序将真正受益于一些控制反转 (IoC) 模式 - 这样你只需在开始时定义什么是记录器,什么是电源,谁作为显示器执行,以及何时有人需要 IoC 容器提供的特定设备。这样,您就不必在每次有新设备出现时都重写代码 - 只需向 IoC 容器注册新类型,一切正常。
关于vb.net类组织,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3613547/
我是 Django 新手并开始了一个项目,我想以正确的方式去做。 我想知道您认为组织项目的最佳实践是什么。 以下是我的一些问题: 如何将静态资源与 Python 代码分开,以免浪费时间通过 Djang
通过这个组织,是否可以引用“id”属性? function house(id) { this.id = id } house.prototype.buy = function() { }
我的任务是“识别并修复任何错误”。这张取自 Java 教科书的图片显示了 Swing 结构的组织。这对我来说很好,我没有发现任何问题。 谁能解释一下? JPanel 应该放在 JComponent 之
重要的事情 是否可以确定 WHERE 条件的最佳顺序以使其更快?例如,我有一个包含 6 个条件的查询。一些简单,另一些带有子查询或函数。我的想法是对查询进行概要分析,以确定条件语句 true 的常见程
我有 Java/AS3/Javascript 背景,我的所有类都组织成包,以帮助表示它们的功能。 在开始一个 C++ 项目时,我试图以几乎相同的方式模仿这个文件系统结构,但我一直遇到包含问题。 目前我
我正在使用 CKAN 作为开放数据门户。我已经完成了 CKAN 实例的设置并添加了数据集、组和组织。 主页上有一个特色组和一个特色组织框。如何在主页上显示我想要的组和组织。 如何在主页上更改这些特色组
我已经创建了我的第一个 iPhone 应用程序,它可以在表格 View 中显示类似类型的音轨。用户可以使用类似 ipod 的控件来播放音轨,这些控件可以流式传输 mp3。 我的所有代码都在两个主要类中
我将我的代码组织成 20-60 行模块,通常采用模块模式。我想要一个结构良好的面向对象的 JavaScript 库。 这是最好的方法吗?代码已经过测试并且有效。 我喜欢它,因为程序员可以从库中提取模块
我正在使用 riot.js 和 jquery 构建一个应用程序。一切都按预期工作,但是随着代码的增长,我也担心在代码中随机/意外的地方触发和处理事件 (.trigger/.on) 对保持我的代码有条理
这是另一个 GIT 新手。 我想在我们的项目中使用 GIT。 团队不熟悉 GIT。 这些项目基本上由一些通用项目(*)和一些应用项目组成。应用程序正在使用公地,公地也可以使用其他公地。通过“使用”我的
例如,考虑一个组织有一个包含两个分支的存储库的情况,master 和 1.0.0.1。 是否可以让团队对 master 具有只读访问权限,而对分支 (1.0.0.1) 具有读写访问权限? 最佳答案 自
我一直致力于寻找组织 CSS 代码的最佳方式,尤其是在大型网站上。我对编写风格不太感兴趣,而对人们如何构建和管理他们的代码更感兴趣。 我一直在遵循这个结构,我觉得它在可维护性方面工作得很好,但我想听取
我们正在扩展到一个大型微服务构建,并通过 postman 完成更多测试(现场验证、错误测试等)。好奇...您的团队如何组织大量 API 的集合? (按 API、按测试类型、按发布等)从一个团队传递到另
我最近遇到了这个编码面试问题,但似乎找不到答案。这是问题。 给定一个整数数组,编写一个函数,返回组织数组所需的最小交换,使得相邻元素的绝对差都小于或等于 K。交换可以是任意两个数组元素,不一定是相邻的
我有 100 多页。所有页面都使用不同的模板。 目前,我有一长串 .state('page.html').state('page2.html') 等。10-15 页后,我认为这变得不可读/难以管理。
我看下grails-app/i18n有一吨messages*.properties捆绑。我想将我的应用程序国际化,但每页有 1 个“捆绑集”。我所说的包集是指包含相同文本但用于不同语言的一组包/属性文
我正在编写一个非常非常长的 CUDA 内核,它对人类的可读性来说非常糟糕。有什么方法可以用内核外部的功能组织 CUDA 内核吗?示例: __global__ void CUDA_Kernel(int*
我的公司要求我将Outlook用于我的电子邮件。 Outlook几乎不执行我想做的任何事情,这让我感到非常沮丧。 (我并不是要在这里发动一场火焰大战,它必须完全执行数千名CEO想要做的事情,但我不是C
我一直在尝试一些不同的方法来组织我的 javascript 应用程序中的代码,我想知道哪种方法最合适。 第一个例子: var Application = { init: function()
Angular 样式指南包含有关在应用程序中使用类和接口(interface)的最佳实践的信息。但它没有任何关于如何组织我的接口(interface)和模型类的信息。 有一个问题:关于文件和类的组织有
我是一名优秀的程序员,十分优秀!