所以我不确定我的头衔是否最准确,但我试图给出最好的解释。
我最近在面试时被问到这个问题(或多或少,因为我不记得完整的问题。这是我的头脑中的一个):
您需要创建一个可以通过puTTy(或任何其他客户端)访问的简单tcp服务器。
进入后,您需要写下:
登录<用户名> (无论用户名是什么)。
登录后,您可以执行3项操作:
showDevices - 将返回设备列表(目前我们有灯和空调) - 我们可以编写模拟对象。我们假设他们有一个数字Id。
开关< deviceId> < on | off> - 打开或关闭设备。
SetValue< deviceId> <双> - 设置设备的测距值(空调温度)
重要的事情:
分离 - 分离逻辑和通信层。我们现在使用远程服务器,但我们希望以后切换到http服务器。这个过程应该很简单。
可扩展性 - 我们目前有4个操作(login,showDevices,Switch,SetValue) - 编写服务器,以便其他程序员可以轻松添加其他操作。代码应该是不言自明的
作业可以用任何语言编写。我尝试用C#编写它,直到我被卡住并且无法继续。最近我更喜欢Node js并且决定再给它一个...所以我要求你们为这个解决方案提供一些有用的指导。
如何在通讯和逻辑层之间进行最佳分离?
我是否应该实现某种设计模式,以便更轻松地添加命令? (我查看了命令设计模式,我无法确定它是否适用于这种情况)
任何可以指导我走上正确轨道的事情(不告诉我具体做什么)都将受到赞赏。
谢谢!
答案 0 :(得分:1)
我真的很喜欢这个挑战,我可能不得不为自己的技术采访偷走它。 :)
我认为(因为你不要去编写代码),我在Node中接近它的方式类似于commander.js
模块。
因此,一个处理套接字的模块,可能只是一个允许连接的server.js文件,然后需要暴露可用命令的模块。
可用的命令只是(取决于你想如何允许升级)给定目录中的所有模块(如commander.js)或所有以某个关键字为前缀的模块(如grunt都这样)。
如果您不想自己执行require-directory
模块,则可以要求目录中的所有文件,然后通过数组访问表示法访问每个命令。
如果这个级别太高,请告诉我,但这是我在Node中采用的一般方法。
在C#中它会更难,你需要依靠反射来允许在运行时添加新的插件,或者使用DI容器在编译时找到它们。