语言"挂断电话"是什么?
我感兴趣地阅读了一些最近的语言与语言问题... Perl与Python,Python与Java,一种语言能否比另一种更好?
我注意到的一件事是,我们中的许多人都有肤浅的理由而不喜欢语言。我们一眼就注意到了这些事情,它们将我们拒之门外。我们回避了可能是非常好的语言,这是因为如果我们打扰的话,我们可能会在2秒钟内学会爱或者忽略这些功能。
好吧,我和下一个家伙一样内,,即使不是更多。开始:
- Ruby:我看到的所有Ruby示例代码都使用`puts'命令,这是一种幼稚的Yiddish解剖术语。因此,即使我应该,我也不能认真对待Ruby代码。
- Python:第一次看到它时,我对整个重要的空白区域都笑了。在接下来的几年中,我避免使用它。现在,我几乎不用其他任何东西了。
- Java:我不喜欢identifiersThatLookLikeThis。我不确定为什么会这样。
- Lisp:我对所有括号都感到困惑。重要性和目的不同的事物(函数声明,变量赋值等)在语法上没有区别,我也懒得学习什么。
- Fortran:大写都会伤害我的眼睛。我知道现代代码不必这样写,但是大多数示例代码是...
- Visual Basic:令我感到困惑的是,Dim是用来声明变量的,因为我记得GW-BASIC仅用于维数组时的美好时光。
乍一看对我来说哪种语言合适? Perl,C,QBasic,JavaScript,汇编语言,BASH Shell,FORTH。
好吧,现在我已经晾干了脏衣服...我想听听你的声音。语言困扰是什么?哪些表面特征困扰我们?你是如何克服他们的?
解决方案
Java及其检查的异常。我离开Java一段时间,住在.NET世界中,然后最近回来了。
有时候,我的`throws'子句比我的方法内容更庞大。
在C / C ++中,使我烦恼的是,如何使用不同的方式来编写相同的代码。
例如
if (condition) { callSomeConditionalMethod(); } callSomeOtherMethod();
与
if (condition) callSomeConditionalMethod(); callSomeOtherMethod();
等同于同一件事,但不同的人有不同的风格。我希望原始标准在做出决定时更加严格,因此我们不会有这种歧义。它导致代码审查中的争论和分歧!
有时候,我很烦恼人们如何期望所有工作都只有一种语言。根据我们要执行的任务,每种语言都有其优点和缺点。我喜欢基于C的语法语言,因为这是我最常用的语言,并且我喜欢它们赋予开发人员的灵活性。当然,强大的能力伴随着巨大的责任,拥有编写150行LINQ语句的能力并不意味着我们应该这样做。
我喜欢最新版本的VB.NET中的内联XML,尽管我不喜欢使用VB,主要是因为我发现IDE的作用不如C#的IDE。
我讨厌VB讨厌HATE的" End Function"和" End IF"以及" If ...那么"部分。我宁愿看到一个大括号。
Pascal的Begin
和End
。太冗长,不适合括号匹配,更糟糕的是,每个End都没有" Begin"。
Type foo = Record // ... end;
尽管我主要是PHP开发人员,但我不喜欢那些不允许我内联完成足够多事情的语言。例如。:
$x = returnsArray(); $x[1];
代替
returnsArray()[1];
或者
function sort($a, $b) { return $a < $b; } usort($array, 'sort');
代替
usort($array, function($a, $b) { return $a < $b; });
我发现Perl对" defined"和" undefined"值的使用是如此有用,以至于我在没有脚本语言的情况下遇到麻烦。
Perl:
($lastname, $firstname, $rest) = split(' ', $fullname);
无论$ fullname中有多少个单词,此语句的执行效果都很好。在Python中尝试使用它,如果$ fullname不完全包含三个单词,它将爆炸。
Java的软件包。我发现它们很复杂,因为我不是公司,所以更是如此。
我非常喜欢命名空间。我会克服它,当然我正在使用Android SDK,而Eclipse消除了很多麻烦。我以前从未有过可以交互式运行它的机器,现在,我的确给我留下了深刻的印象。
C和C ++的语法有点古怪。他们将运算符重用于不同的事物。我们可能已经习惯了它,以至于我们不去想它(我也不这样做),但是考虑一下括号有多少含义:
int main() // function declaration / definition printf("hello") // function call (int)x // type cast 2*(7+8) // override precedence int (*)(int) // function pointer int x(3) // initializer if (condition) // special part of syntax of if, while, for, switch
如果在C ++中,我们看到了
foo<bar>(baz(),baaz)
如果没有foo和bar的定义,我们将无法理解含义。
- <和>可能是模板实例化,或者可能小于和大于(不常见但合法)
- ()可能是一个函数调用,或者可能只是在逗号运算符周围(即,执行baz()以获取大小效果,然后返回baaz)。
可笑的是,其他语言也复制了其中一些特征!
PHP的函数名称不一致。
// common parameters back-to-front in_array(needle, haystack); strpos(haystack, needle); // _ to separate words, or not? filesize(); file_exists; // super globals prefix? $GLOBALS; $_POST;
如果Microsoft必须使用Cw发明另一种类似C ++的语言,为什么他们不纠正Java的错误并实现对RAII的支持?
SQL,他们说我们不应该使用游标,当我们使用游标时,我们就真正理解了原因...
它是如此沉重!
DECLARE mycurse CURSOR LOCAL FAST_FORWARD READ_ONLY FOR SELECT field1, field2, fieldN FROM atable OPEN mycurse FETCH NEXT FROM mycurse INTO @Var1, @Var2, @VarN WHILE @@fetch_status = 0 BEGIN -- do something really clever... FETCH NEXT FROM mycurse INTO @Var1, @Var2, @VarN END CLOSE mycurse DEALLOCATE mycurse
世界上没有比PHP更讨厌的东西了。
- 带$的变量,对于每个变量来说,这是一个额外的奇数字符。
- 使用->访问成员没有明显的原因,每次访问成员时都额外增加一个字符。
- 确实是语言的怪胎。
- 没有名称空间。
- 字符串以..串联
- 一种语言的怪胎。
区分大小写。
我们需要什么样的宿醉,才能认为仅通过caSE区分两个标识符是个好主意?
我有多年的实践经验,可以公开和调试其他人的代码。我将(从所有语言中)删除在条件语句中对逻辑操作进行分组的功能。这来自对AND运算符的特定抱怨,例如...
if (a and b) { do something }
有四种情况,其中三种尚未处理。程序员很可能已经考虑了所有4种情况,并故意选择以这种方式编写代码,但是除非有注释并且通常不注释,否则我们没有迹象表明是这种情况。
可能会有些冗长,但以下内容并没有歧义。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
if (a) { if (b) { do something } else { what about this case? } } else { if (b) { what about this case? } else { do something else } }
至少一年后,随着这个穷人的跟进,我将确切地知道应该怎么做。
我从来不喜欢在某些脚本Shell中向后拼写的关键字
if-then-fi够糟糕的,但eac案变得越来越傻
团队项目中的编码样式不一致。
我正在一个大型团队项目中,其中一些贡献者使用了4个空格而不是制表符。
使用他们的代码可能会很烦人,我想保持代码整洁并保持样式一致。
当我们对不同的语言使用不同的标准时,这已经很糟糕了,但是在具有HTML,CSS,Javascript,PHP和MySQL的Web项目中,这是5种语言,5种不同样式,并且乘以从事该项目的人数。
当我需要修复某些问题时,我很想重新格式化我的同事的代码,但是随后存储库会认为我更改了他们代码的每一行。
我只是想到了另一个...我讨厌XML中用于定义名称空间的几乎毫无意义的URL,例如xmlns =" http://purl.org/rss/1.0/"
Prolog的if-then-else语法。
x -> y ; z
问题是";
"是"或者"运算符,因此上面看起来像"
x`暗含了" y"或者" z"。
我讨厌Lisp和Scheme中的括号,因为在C语言之后,类似Cand的语言似乎很模糊,而且还不清楚事物之间的关系。但是,既然我对Scheme有所了解,并且它是通常的格式设置准则,那么我不会说我喜欢它的工作方式,但是至少我了解并克服了阅读用CLisp / Scheme编写的代码时的担心。
我认为,如果我们学习了一些东西并使用了一段时间(也许什至几个小时就足够了,至少对我来说这是对的),那么我们实际上可以克服对语法的不满意,并能够专注于自己应该做的事情真正使用语言工具。
尽管我主要使用python进行编程,但让我无尽的烦恼的是lambda body必须是表达式。
我仍在全神贯注于JavaScript,总体而言,它几乎是可以接受的。为什么创建命名空间如此困难。在TCL中,它们很丑陋,但是在JavaScript中,它实际上是一个严格的规则,而且完全不可读。
在SQL中,一切都只是一个巨大的freekin SELECT语句。
我讨厌分号。我发现它们会增加很多噪音,并且我们几乎不需要在一行上放置两个语句。我更喜欢Python和其他语言的样式...行的结尾是语句的结尾。
适用于多种语言:
- 区分大小写-谁的主意是?! (并且应该射击使用" SeverallyWordsThatMeanSomething"以及含义不同的"几个单词"的人:)
- 数组索引从0开始。我来自fortran背景,这是另一个原因,但是在数学中,数组索引总是以1开始。因此,在实现更大的模型时,它往往会引起很多麻烦(尤其是在调试时)。
- 分号-只是代码中的垃圾。如果我们谨慎编写代码(fortran,python等),则不需要它们。如果我们不是,他们将无法拯救我们。
- 弯括号-参见3.
p.s.大家都在那里。别生气如果我们不喜欢答案,就不应该问。
我喜欢面向对象的风格。因此,在Python中看到len(str)来获取字符串的长度,或者用另一种语言来拆分诸如split(str," |")之类的字符串,这使我很困惑。在C语言中没问题;它没有对象。但是Python,D等确实具有对象,并在其他地方使用obj.method()。 (我仍然认为Python是一种很棒的语言。)
不一致对我来说是另一个大问题。我不喜欢在同一库中命名不一致:length(),size(),getLength(),getlength(),toUTFindex()(为什么不使用toUtfIndex?),Constant,CONSTANT等。
.NET中的长名称有时会打扰我。他们不能以某种方式缩短DataGridViewCellContextMenuStripNeededEventArgs吗?那么ListViewVirtualItemsSelectionRangeChangedEventArgs呢?
而且我讨厌深层目录树。如果一个库/项目有一个5级深目录树,我将遇到麻烦。
目标C中的所有[]和@s。它们的使用与底层C的本机语法有很大不同,以至于我第一次看到它们时,给人的印象是,所有面向对象的内容都是笨拙地固定在事后才想到的。
tsql开始和结束...这很烦人...
在大多数语言中,文件访问。到目前为止,VB.NET是唯一使文件访问对我有意义的语言。我不明白为什么要检查文件是否存在,我应该使用File.exists("")或者类似的东西来代替创建文件对象(实际上是VB.NET中的FileInfo)并询问是否存在。然后,如果要打开它,则要求它打开:(例如,假设一个名为fi的FileInfo对象)是fi.OpenRead。返回流。好的。正是我想要的。如果要移动文件,请fi.MoveTo。我也可以做fi.CopyTo。对于大多数语言而言,不使文件成为完整的对象有什么废话?另外,如果我要遍历目录中的文件,则可以只创建目录对象并调用.GetFiles。或者,我可以执行.GetDirectories,然后获得一组全新的DirectoryInfo对象。
诚然,Java有一些此类文件内容,但是必须要有一个整个对象来告诉它如何列出文件的这种胡说八道是愚蠢的。
另外,我讨厌::,->,=>和除<=和> =(可能还有-and ++)以外的所有其他多字符运算符。
不能完全确定数组/循环/字符串字符索引是从零开始还是从一开始的任何语言。
我个人更喜欢从零开始的语言,但是任何将两者混为一谈或者让我们"配置"使用的语言都可以助我们一臂之力。 (Apache Velocity我正在朝方向努力!)
从VTL参考中截取(默认为1,但我们可以将其设置为0):
# Default starting value of the loop # counter variable reference. directive.foreach.counter.initial.value = 1
(尝试合并使用不同计数器方案的2个项目!)
我最大的麻烦是MATLAB的语法。我使用它,并且我喜欢它,但是它有很多烦人的怪癖。让我们来看看。
- 矩阵用括号索引。因此,如果我们看到类似Image(350,260)的内容,那么我们是否就不知道是从Image矩阵中获取元素,还是调用名为Image的函数并将参数传递给它。
- 范围是疯狂的。我似乎记得,循环结束后,for循环索引变量仍在作用域内。
- 如果我们在分配后忘记使用分号,则该值将被转储到标准输出中。
- 每个文件可能只有一个功能。事实证明,这对于组织工作非常烦人。
如果可以考虑的话,我敢肯定我会提出更多建议。
[免责声明:我只对VB熟悉,因此请多加评论。
我讨厌VB中的每个关键字都是这样大写的。我在前一周(一个月?)看到了一篇博客文章,内容涉及某人尝试编写没有任何大写字母的VB代码(他们对编译器做了一些操作,使他们可以像这样编译VB代码),并且该语言看起来好多了!
在Ruby中,我非常不喜欢方法不需要在当前实例上调用self而是在属性上调用(否则它们将与本地冲突)。 IE。:
def foo() 123 end def foo=(x) end def bar() x = foo() # okay, same as self.foo() x = foo # not okay, reads unassigned local variable foo foo = 123 # not okay, assigns local variable foo end
在我看来,这是非常不一致的。我宁愿或者在所有情况下总是要求"自我",或者对当地人有一个印记。
我得到了一个。
我对所有过于严格的静态类型语言都不满意。
我一直认为Cwa很棒,直到我开始被迫编写如下代码:
void event...(object sender,EventArgs e){ int t=(int)(decimal)(MyControl.Value); //Value is an object which is actually a decimal to be converted into an int }
哦,属性很难看。微软能否认真考虑一下比[[MyAttribute(Argument)] void function ...`更糟糕的事情? wtf?甚至不让我开始使用XAML标记。
由于空白问题,我不能认真对待Python。
有时候我很难认真对待Ruby,因为
a)我从《为什么要辛辣指南》中自学
b)在某些情况下,标识符类型由大小写决定。我已经超越了这个范围,尽管它比const
关键字更明智,更干净。现在,在每种语言中,当我使常量不变时,它都是大写的。
哦,我也讨厌
if(a) b();
句法。你不知道我刚做了多少次
if(a) b(); c();
用这样的代码偶然生成的代码。实际上,使用以下代码可能会更糟
if(a) b(); c();
它应该能够使用的唯一地方是
if(a){ .... }else if(b){ ...
我讨厌Java的样板式冗长。
- 编写属性的获取器和设置器
- 检查异常处理以及所隐含的所有言语
- 进口清单很长
那些与使用veryLongVariableNames
的Java约定有关的内容,有时让我想我回到了80年代,在程序顶部编写了" IDENTIFICATION DIVISION"。
提示:如果可以在IDE中自动生成部分代码,则很好地暗示我们正在生成样板代码。使用自动化工具,这不是编写问题,但是每次有人不得不阅读该代码(这是更常见的情况)时,这都是一个障碍。
虽然我认为这种类型的官僚主义有点过分,但Scala已成功解决了其中的一些问题。
排名不分先后...
OCaml
- 元组定义使用" *"分隔项目,而不是","。因此,`(" Juliet",23,true)具有类型为(string * int * bool)。
- 对于如此出色的语言,该文档对线程具有令人困扰的注释:"线程库是通过在单个处理器上分时实现的。它不会利用多处理器计算机。因此,使用该库永远不会生成程序跑得更快。" JoCaml不能解决此问题。
- ^^^我听说Jane Street的人们正在努力为OCaml添加并发GC和多核线程,但是我不知道它们取得了多大成功。我无法想象没有多核线程和GC生存很长时间的语言。
- 在顶层探索模块没有简单的方法。当然,我们可以编写
module q = List ;;
,并且顶层将愉快地打印出模块定义,但这似乎很不客气。
C#
- 糟糕的类型推断。除了最琐碎的表达式之外,我还必须为通用函数提供类型。
- 我曾经读过的所有LINQ代码都使用方法语法
x.Where(item => ...)。OrderBy(item => ...)
。从来没有人使用过表达式语法,"从x中的项开始……orderby……选择"。在我们和我之间,我认为表达式语法很愚蠢,即使在其他所有C#和VB.NET代码的背景下,表达式语法看起来像是"外来的",也没有其他原因。
LINQ
每种其他使用行业标准名称的语言是Map,Fold / Reduce / Inject和Filter。 LINQ必须有所不同,并使用"选择","聚合"和"位置"。
功能编程
Monad是令人迷惑的。看到了Parser monad,Maybe monad,State和List monad之后,我可以完全理解代码的工作原理。但是,作为一般的设计模式,我似乎看不到问题,只能说"嘿,我敢打赌单子在这里很合适"。
红宝石
GRRRRAAAAAAAH !!!!!我的意思是……认真。
VB
Module Hangups Dim _juliet as String = "Too Wordy!" Public Property Juliet() as String Get Return _juliet End Get Set (ByVal value as String) _juliet = value End Set End Property End Module
二传手的声明是我存在的祸根。好了,所以我更改了属性的数据类型-现在我也需要更改设置器中的数据类型吗? VB为什么不从Cand借用简单地合并一个称为值的隐式变量?
.NET Framework
我个人喜欢Java大小写约定:类是PascalCase,方法和属性是camelCase。
我讨厌在Python中我永远不知道某个对象是某个方法还是某个随机函数在浮动(请参阅内置函数)。感觉就像他们开始使该语言成为面向对象的语言,然后松了一口气。对于我来说,让这样的函数成为某些基类(例如Object)上的方法对我来说更有意义。
我也讨厌__methodName__风格的方法,如果我真的想,我仍然可以从类外部访问类中的私有内容。
空格要求使我烦恼;我不希望语言设计师以某种方式使我编码。
我不喜欢Python坚持的一种正确的做事理想。我要选择。