关于为什么讨论语言的问题 -- 两个凡是

宏哥 发布于 2016/09/09 17:33
阅读 362
收藏 0

实际上, 语言没有什么好讨论的, 简单就好了

问题是太多语言都太复杂了, 结果, 程序员根本没有机会学习真正的知识

如果不让语言简单

去讨论那些复杂的事情,程序员根本没有足够的智商去理解

随便举个例子:

功能权限 和 数据权限 区别是什么?

加载中
2
乌龟壳
乌龟壳

语言简单是简单,但有时候遇到这情况,就会让人落坑里爬半天

<?php

// 这是读到的数据
$a = '0';
$b = NULL;
$c = '';

// 结果是0
echo $a + $b + $c;

/*
麻烦的是这段代码隐含以下异常逻辑
1. 如果输入是空,则代表0
2. 如果变量未赋值,则代表0
2. 如果输入是字符串,则转成整型
最近才被这个坑过,
在文档里找了半天没找到在一些异常输入下,
为啥会有这样的结果,后来一点点调才发现这个坑
*/

所以如果遇到二进制级别的协议解析,还是不要用PHP等动态语言为好,太灵活的反面就是不严谨。

-------------补充------------------

有人说这是我写的代码不严谨,好的,那我就上严谨版。

<?php

// 这是读到的数据
$a = '0';
$b = NULL;
$c = '';

// 结果是2
$default = 1;

$a = isset ( $a ) ? $a : $default;
$b = isset ( $b ) ? $b : $default;
$c = isset ( $c ) ? $c : $default;

$a = strlen ( $a ) != 0 ? $a : $default;
$b = strlen ( $b ) != 0 ? $b : $default;
$c = strlen ( $c ) != 0 ? $c : $default;

echo $a + $b + $c;

那么问题来了,方便性去哪里了?代码量已经和静态类型语言持平了!然而静态类型语言在语法上就不允许那么随意地默认null怎么做,空字符串怎么做,尽量让人对每行代码负责。

借用一位PHP高手的话,很清楚地点出了PHP不严谨的地方【PHP大度的不报错,偷偷帮你转成数值类型了,你就逃过一个报错

以上代码一眼看去当然懂了,但是我实际要解决的问题,是藏在一大堆逻辑里面的,没有编译器帮忙,需要人工去做的严谨,有时候效率不高容易出错。

-----------------我是点评分割线-------------------

PHP设计这么灵活其实并不是错,因为对于HTML等文本模版语言来说,如果大部分工作最终目的都是转字符串,那么默认很多边界情况的处理方式会极大地减少代码量。

然而不是所有程序做的都是转字符串的事情。

mark35
mark35
mysql更厉害,‘’空白字符串入库的时候都给你自动转成0了呢~
乌龟壳
乌龟壳
回复 @eechen_ : 大哥,我更新了回复,你再看看。
乌龟壳
乌龟壳
回复 @eechen_ : 哈哈,等我有空详细说下
eechen_
eechen_
回复 @乌龟壳 : 既然你是用弱类型,自然要考虑这种问题,比如:你做加法运算,为什么会有字符串和null和空值,严谨的程序员会转换为数值类型再做运算,只是你不严谨,没有转,PHP大度的不报错,偷偷帮你转成数值类型了,你就逃过一个报错。不是PHP不严谨,是你不严谨罢了。
乌龟壳
乌龟壳
回复 @eechen_ : 之所以被坑就是因为这些规则太复杂,一个+隐含了不止int/float数值类型的类型转换,还隐含了NULL/''/'1234'一些比较特殊字符串等类型的类型转换。这些东西都是一个个规则,难道不用去记?我主要在说复杂,不是说不懂。
下一页
0
eechen_
eechen_

引用来自“乌龟壳”的评论

语言简单是简单,但有时候遇到这情况,就会让人落坑里爬半天

<?php

// 这是读到的数据
$a = '0';
$b = NULL;
$c = '';

// 结果是0
echo $a + $b + $c;

/*
麻烦的是这段代码隐含以下异常逻辑
1. 如果输入是空,则代表0
2. 如果变量未赋值,则代表0
2. 如果输入是字符串,则转成整型
最近才被这个坑过,
在文档里找了半天没找到在一些异常输入下,
为啥会有这样的结果,后来一点点调才发现这个坑
*/

所以如果遇到二进制级别的协议解析,还是不要用PHP等动态语言为好,太灵活的反面就是不严谨。

-------------补充------------------

有人说这是我写的代码不严谨,好的,那我就上严谨版。

<?php

// 这是读到的数据
$a = '0';
$b = NULL;
$c = '';

// 结果是2
$default = 1;

$a = isset ( $a ) ? $a : $default;
$b = isset ( $b ) ? $b : $default;
$c = isset ( $c ) ? $c : $default;

$a = strlen ( $a ) != 0 ? $a : $default;
$b = strlen ( $b ) != 0 ? $b : $default;
$c = strlen ( $c ) != 0 ? $c : $default;

echo $a + $b + $c;

那么问题来了,方便性去哪里了?代码量已经和静态类型语言持平了!然而静态类型语言在语法上就不允许那么随意地默认null怎么做,空字符串怎么做,尽量让人对每行代码负责。

借用一位PHP高手的话,很清楚地点出了PHP不严谨的地方【PHP大度的不报错,偷偷帮你转成数值类型了,你就逃过一个报错

以上代码一眼看去当然懂了,但是我实际要解决的问题,是藏在一大堆逻辑里面的,没有编译器帮忙,需要人工去做的严谨,有时候效率不高容易出错。

-----------------我是点评分割线-------------------

PHP设计这么灵活其实并不是错,因为对于HTML等文本模版语言来说,如果大部分工作最终目的都是转字符串,那么默认很多边界情况的处理方式会极大地减少代码量。

然而不是所有程序做的都是转字符串的事情。

个人喜欢而已,强制处理当然写的代码质量会更高些。但是开发效率就低了,不能两全。

比如:python里面字符串+数值会抛异常,但是PHP字符串.数值 会将数值默认转换为字符串再连接,我认为这种默认行为会很省事省代码,大多数Pythoner还不是会把数值转换为字符串再连接,然而PHP默认就帮你做了,省了很大的事。

所以,PHP这些隐式转换,还是很方便很省代码的。

其实总归到底,是不同语言的设计思想不一样罢了,有的语言强制处理异常,有的语言不强制处理异常。

比如:文件不存在的异常。如果确定该文件一定存在,就没必要处理了该异常了。增加代码量。。。但是该文件可能不存在,但是没处理该异常,该程序就不严谨了。

所以:还是看程序员的喜好,我更喜欢PHP之类,能有更多默认行为,大多数默认行为还是很方便的,帮程序员干了很多好事(当然也有坏事),减少了程序员代码。而不是一言不合就报错,啥事都要程序员手动来处理。


PHP是尽可能帮程序员做更多事,当然有好事也有坏事,而Java之类,不确定的就抛异常,所以没什么对和错。看个人喜好。。。

jiuker
jiuker
什么js,h5,webapp,混合app,css3,nodejs,nodejs构建脚手架开react-native工啦,golang开发api呀,也才3年而已,比不上你们这些大神,我现在都是一人前后端都做,哎,我还是太菜了,大神php都可以写操作系统了,我也就只能用golang做守护进程,
eechen_
eechen_
回复 @jiuker : 无知小辈,多学几门语言提高下见识吧 哎~
jiuker
jiuker
这就是你菜的理由
乌龟壳
乌龟壳
我从来都是站在中立的角度,不偏任何技术,只根据场景选择合适的。
乌龟壳
乌龟壳
你说的没错,当然是看场景,我也伺指出了哪个场景不适合PHP而已嘛,其实我们观点是一样的。
返回顶部
顶部