2016-12-30 75 views
0

我们可以使用net.createServer([options][,connectionListener])创建一个服务器。通常回调函数connectionListener有一个参数client,正如我所看到的,它是上下文中的一个套接字实例(在函数体中,客户端调用方法on(),所以我判断它是套接字实例)。如何定义参数类型?

var net = require('net') 
var server = net.createServer(function(client){ 
    client.on('data',function(data){ 
     console.log('Client sent' + data.toString()); 
    }); 
    client.on('end',function(){ 
     console.log('Client disconnect'); 
    }); 
}); 

但不像Java或C#,存在定义时,这个回调函数的参数前面没有类型,程序如何知道参数类型是什么?

使用http.createServer()来创建服务器时使用同样的难题。

+2

它是Javascript。 Javascript不是强类型的。 *理论上*它可以是任何类型或成为任何类型。 – Bauss

回答

1

JavaScript中的类型在运行时动态解析,而不是在编译时静态解析,如同其他一些语言一样。

因此,问题的答案程序知道什么是参数类型是:类型是在运行时传递的任何内容。

但是,问题的答案程序员知道什么是参数类型是:该类型是文档中解释的任何内容。

API的文档是API开发人员和API使用者之间的合同。

1

我认为这是静态类型的价值的古老辩论。我假设你已经知道JavaScript“不是静态类型语言”。但是我怀疑你可能会问的是“为什么有人想写这种代码。”

有两种心态,我看到发动战争:

  • 任何语言都没有静态类型是不完整的。没有它们,你就不能编写健壮,稳定的代码。如果您不知道传入的类型,那么您将受到威胁。

(我把这个想法称为“每种字母都有一个邮箱”,你不需要检查这个字母,只有一种可以装入这个盒子中,如果你有很多不同种类的字母,会有很多不同种类的邮箱)。

  • 静态类型是一个学术多报。他们妥协的灵活性,成为一种编程拐杖。不管什么类型,我只需要看看它是否有我想要的数据。

(我把这个想法称为“大多数字母的一个邮箱”。字母的类型并不重要,你可以检查它看看你得到了什么,并决定是否保留它或抛出它会消失,你将拥有非常少的邮箱,甚至可能只有一个,具体取决于)。

在我25年的编程中,我已经获得了Java语言认证,Microsoft开发人员认证,Adobe ActionScript开发人员认证以及其他一些我甚至都不记得的认证。我专业教过JavaScript,C#和ActionScript。所以我非常熟悉强大实现类型系统的语言,而不熟悉类型系统的语言。

我的观察;对类型系统的严格遵守确实可能会导致开发人员过度设计过于繁琐的代码。重点是形式而不是功能。这使得工程变得更加困难,随着时间的推移变得更加困难,但更容易进行逆向工程。但是与此同时,完全放弃类型确实可能会导致开发人员创建代码不稳定的工程。重点是形式功能。这使得工程变得更容易,随时间变化更容易,但更难以进行逆向工程。

要回到我的邮箱的事情,有时它使一个一般使用邮箱有很多意义。有时候,有一个非常特殊的邮箱更有意义。

我相信如果一个人的思维方式在所有方面都是无限优越的话,那么这种思维方式在很久以前就会赢得。我们都要用Java或JavaScript(或多或少)编码,因为在任何情况下,总会比另一个更好地构建更好的软件。

我认为有很多证据表明事实并非如此。 Java(静态类型的典型支持者)正在添加松散类型的“功能性”语言的功能(甚至演变成诸如Scala之类的东西),像JavaScript这样的语言结合了来自静态类型的“OOP”语言的功能,如ES6类演变成超类如TypeScript)。

看看你的原始代码:这些函数和事件处理函数可以从静态类型中获益吗?

也许吧。 “服务器”意味着一些可能是严格打字的明智之举。你不想要任何惊喜。在这里,一个信箱的一个信箱。这将使得切换客户端实现变得更加困难,但也许这是一件好事(或不依赖于)。可能有多种不同类型的createServer(clientTypeA),createServer(clientTypeB)API调用等(如Java重载)。

另一方面,看看事件处理程序。 “数据”对于刚性类型是否有意义,或者更实际一点就是使其成为“*”,并让代码检查它的需求?这里,多种字母的一个邮箱更具实用意义。

希望对此有所了解。我一直都有这个对话。我很幸运地拥有编程围栏的双方,但是很多开发人员(尤其是Java comp sci grads)都会忽略功能性编程中的任何事情(甚至不会说那些像匿名功能这样的东西是“不正确”的),或者在篱笆的另一边,无论如何都会以任何方式忽略任何有“僵化”的东西。

恕我直言,两者都是错误的,而且都是正确的。照常。你并不总是需要合同的刚性来与其他人有效地合作,或者知道他们在做什么,实际上它可能会阻碍他人。但根据具体情况,拥有一个可能非常聪明。

+0

rsp给了我一个很好的答案,你给了我一个很好的教训。感谢您和2017年快乐编码! :) –

相关问题