在节点js

时间:2016-05-10 14:32:37

标签: node.js design-patterns tcp dependency-injection

所以我不确定我的头衔是否最准确,但我试图给出最好的解释。

我最近在面试时被问到这个问题(或多或少,因为我不记得完整的问题。这是我的头脑中的一个):

  

您需要创建一个可以通过puTTy(或任何其他客户端)访问的简单tcp服务器。

     

进入后,您需要写下:

     

登录<用户名> (无论用户名是什么)。

     

登录后,您可以执行3项操作:

     
      
  • showDevices - 将返回设备列表(目前我们有灯和空调) - 我们可以编写模拟对象。我们假设他们有一个数字Id。

  •   
  • 开关< deviceId> < on | off> - 打开或关闭设备。

  •   
  • SetValue< deviceId> <双> - 设置设备的测距值(空调温度)

  •   
     

重要的事情:

     
      
  • 分离 - 分离逻辑和通信层。我们现在使用远程服务器,但我们希望以后切换到http服务器。这个过程应该很简单。

  •   
  • 可扩展性 - 我们目前有4个操作(login,showDevices,Switch,SetValue) - 编写服务器,以便其他程序员可以轻松添加其他操作。代码应该是不言自明的

  •   

作业可以用任何语言编写。我尝试用C#编写它,直到我被卡住并且无法继续。最近我更喜欢Node js并且决定再给它一个...所以我要求你们为这个解决方案提供一些有用的指导。

  • 如何在通讯和逻辑层之间进行最佳分离?

  • 我是否应该实现某种设计模式,以便更轻松地添加命令? (我查看了命令设计模式,我无法确定它是否适用于这种情况)

  • 任何可以指导我走上正确轨道的事情(不告诉我具体做什么)都将受到赞赏。

谢谢!

1 个答案:

答案 0 :(得分:1)

我真的很喜欢这个挑战,我可能不得不为自己的技术采访偷走它。 :)

我认为(因为你不要去编写代码),我在Node中接近它的方式类似于commander.js模块。

因此,一个处理套接字的模块,可能只是一个允许连接的server.js文件,然后需要暴露可用命令的模块。

可用的命令只是(取决于你想如何允许升级)给定目录中的所有模块(如commander.js)或所有以某个关键字为前缀的模块(如grunt都这样)。

如果您不想自己执行require-directory模块,则可以要求目录中的所有文件,然后通过数组访问表示法访问每个命令。

如果这个级别太高,请告诉我,但这是我在Node中采用的一般方法。

在C#中它会更难,你需要依靠反射来允许在运行时添加新的插件,或者使用DI容器在编译时找到它们。