Project1

标题: 很抱歉 gonglinyuan 君,我要打脸 [打印本页]

作者: shitake    时间: 2016-4-17 04:36
标题: 很抱歉 gonglinyuan 君,我要打脸
本帖最后由 shitake 于 2016-4-17 04:36 编辑

@gonglinyuan

嗯,如题。关于阁下在 Ruby有什么简单的地方 一帖中的一些言论,实在是不能苟同。所以这篇帖子就是说说那些有异议的地方。虽然标题有点凶残,不过我大概会很温柔的。

1.关于 IDE 的错误提示的某些言论
阁下认为 IntelliJ Idea 在没 JSDOC的时候错误提醒很废,废到连函数调用时少了括弧都查不出来。原话如下:
我用的是破解版IntelliJ Idea写JS,有JSDOC的时候的确很好用,甚至堪比java的IDE,但是没有JSDOC的时候我调用函数的时候漏了括号都查不出来。


关于此点,能做到这一点的IDE大概现在是不存在的,以后很长时间也不会存在。恕我直言,如果真有一个IDE能完美的找出这类错误,那么那时候应该也不会需要会写出这种错误的程序员了。之所以我这样说,来让我们看看你提道的例子:
比如 var events = map.events(); 被我敲成了 var events = map.events。。


我们要知道,在javascript中,一个 Function 对象,当其后跟括弧时,表示函数调用 ;不跟括弧时,表示函数本身。也就是说  var events = map.events(); 和  var events = map.events 两者在语法层面上都是正确的。而且这种错误别说通过上下文分析,如果程序复杂一点的话,你就算跑一边代码也很难发现。除非时百分百覆盖率的单元测试。(另外,这里也和JSDOC毛关系都没有 就算你全写上jsdoc,还是发现不了)这种错误已经是你自己算法和程序逻辑上的错误了,举个例子来说,这就像你写个if判定,自己脑抽,本来是false写成了true,代码运行出错,却跑来怪IDE连这种“低级错误”都检查不出来。

在我看来,代码的错误,更多的应该是靠程序员自我的克制和细致来避免发生,而不是把什么都扔给IDE。虽然不是非要像 taroxd 触那样纸上手写代码都不出错,但也不应该对IDE依赖成性。

2.关于 Fiber 的言论

首先 Fiber并不是什么ruby里独有的既没有效率又复杂难以理解的东西,而且这和线程更是相近但完全不同的概念(线程在 ruby里对应过来是 Thread)。实际上,大多比较“现代化”的程序语言都会有这一概念的实现(ruby python lua go nodejs )。而实际上, Fiber 就是coroutine(协程) 的一种实现,而且fiber这个名字也是完全来源于windows(关于我indows里的fiber:http://blog.codingnow.com/2005/10/fiber.html)。ruby里的fiber 属于 半协程(Semi-Coroutine)。【所谓半协程,是指在它们对控制权传递的选择上收到限制。不对称协程只能将控制权传递回它们的调用者,而对于协程来说,只要它们有相应的句柄,它们就可以自由地将控制传递给其它的任何一个纤程。-----此句属于复制粘贴】

fiber这种东西,在RM里很大一部分是用来实现并发(注意和并行的区别,协程多为并发 线程多为并行)。而且,这篇文章更是直接指出fiber在游戏开发中可以提供很大的便利。
Fiber除了在實現了Enumerator#nex方法這樣子的機能之外,遊戲編程中在處理各種遊戲角色之類的對象、或者是事件驅動的循環處理等這樣子的編程場合中會非常有用。
  在遊戲編程的場合,遊戲內的各種遊戲角色之類的對象有著各自不同的狀態,隨著遊戲的進行,這些狀態也將會變化。


3. 关于ruby的可读性

我就偷点懒,直接引用晴兰前辈在某篇帖子 里提到的:

最后说说可读性问题啊,
可读性英文不叫readability啊!叫read***lity啊!
打星号是有时候说出来或者听人说出来感觉就像脏话一样啊!
Ruby有Ruby自己的风格啊!
拿其他语言来评判Ruby的写法也不对啊!
千万别觉得写得整齐,写得像你知道的其他语言的风格就完了啊!
有些代码每一行都很清晰,但是组合起来看不懂一样维护成本不低啊!
多学学Ruby的readability啊!
先不说看见别人写得短写得精简写得有元编程的代码就觉得read****lity有问题啊!
也不要自己一想写得短写得精简写得有元编程的代码就觉得是奇思妙想啊!
也不要说人类思维不会这么去啊!
你一个人代表不了人类的思维啊!!
这根本就是设计思路不同而已怎么就非人类啊!!!
好心好意分享代码给你看还弄出人参攻击了啊!!!!
放下那些对Ruby的readabillity的成见吧!!!!!


实际上,写出可读性差的代码的,很大一部分就是这些用着其他语言的思路在ruby里乱写一通,一边抱怨可读性差,一边写着可读性差的代码的人写出来的(实际上翻翻6R的老贴,那些从代码逻辑来看功底应该很足,但写的ruby代码却有着各种问题和许多难看的实现的脚本存在不少。当然写了这些脚本的前辈也不是人人都抱怨ruby的可读性,而且有不少前辈的代码也是刚从其他语言迁移过来时写下的) 。剩下的一大半大多就是学艺不精,各个知识点没弄通,再要不就是那个锤子,到处就当钉子敲的家伙。比如6R上一大堆经常连RGSS和ruby都搞不清的,再要不就是照着F1看几天就认为ruby只有这么点东西了的家伙。

这都叫什么事!处处可见指责ruby可读性差的,然而ruby的社区创造出了不少大型的有意义的工程。看看php的laravel,我能说有不少东西是从ROR sinatra 里来的东西,还有javascript 的mocha commander,这那个不是从ruby里借鉴了同名的工程。



以上,大概就是我要吐槽的了,个人学艺不精,如果文中有啥错误,众大触请随意指出。如果言辞上有那位看官看着不顺眼,还望见谅。我就一小小的野生凭兴趣写代码的渣渣,然后随便罗嗦几句。

最后,我想对 gonglinyuan 君说几句,写程序的不应该对新知识抵触,固步自封。而应更多的去听听不同的声音,博览众书。带着偏见和预设立场去看一件事情,永远也得不到正确的结果。我知道你有参加 ACM 的底子,程序方面的基础应该比我这种只学了一年的人要牢固的多。且不可妄尊自大,反而白白浪费掉这些自己的优势。

以及,我推荐你去看看七周七语言系列,应该会有所帮助。

最后,告诫坛子上的众位,无论是在写脚本的,还是打算学习脚本的,都应该抱着一颗虔诚的心去认真对待此事,仔细审核自己写下的每一行代码。编写程序既不是一件千篇一律的枯燥工作,也不是随心而为的胡乱涂鸦,它是一门属于书写者的艺术,是魔法,是奇迹!


作者: gonglinyuan    时间: 2016-4-17 10:42
本帖最后由 gonglinyuan 于 2016-4-17 10:52 编辑

对不起啊,前面因为是点评有200字节限制(还是UTF-8编码的200字节,所以也就六七十个汉字),所以很多事情都没有讲清楚。

首先我是高中生,没有搞过ACM,只参加过高中生级别的的学科竞赛,见识当然不如LZ。而且这种比赛对语言要求不高,虽然用的是C++但是从头到尾其实只会用到C语言的那些基本语法,甚至指针都很少碰(因为查错麻烦)。因此我是一点都不依赖IDE的(如果这个project所有代码都是我自己写的,也用不着什么IDE),因为比赛的时候根本没有什么正常的IDE可以用,基本都用VIM等普通编辑器(还没有插件),查错也用命令行的GDB;甚至有人用没有语法高亮和自动缩进的编辑器(比如notepad)、全靠看代码静态查错找BUG,照样能拿奖牌;因此您应该可以看出这种竞赛和编程语言几乎完全无关了。因此我真正学习语言的时间也就1年不到,所以我们应该是站在同一条起跑线上的,我也没有理由“抵触新知识”、“固步自封”、“带着偏见和预设立场看事情”。

我的看法完全来自个人的体验,表达的也是个人的观点。因为像我们这样的人没有资格评判一个语言的好坏——连Linus Torvalds看待语言问题都很敏感偏激,更何况我们呢。后面我说的也是自己的个人观点。

1. Java。Java我算是学得比较系统扎实的。写Java代码的量也比较大,如果包括注释、JavaDoc、和deprecated的内容,几个Project加起来应该已经有1M字节了。我写Java,先是SublimeText,然后转到Eclipse,后来别人在我面前拼命鼓吹IntelliJ Idea,我就转到了Idea。以前从来看不起IDE的我因此发生了改变,毕竟在学习C和C++的时候我从没有见到过这么好用的IDE,就算是用Visual Studio写C++,感觉也很别扭,总觉得VS不懂我内心在想什么。而Idea给我的感觉就是掌握了读心术。但其实Idea的好用和语言是分不开的。比如Java有严格的命名规范,所以Idea在定义变量的时候会“知道”你会给这个变量起什么名字,然后帮你补全;因为Java比较重视类型,所以Idea能够提醒程序员哪个转换是unchecked的,然后建议你加上@SuppressWarning("unchecked")的annotation来取消这个警告。剩下还有几个跟IDE无关的特性。比如Java要实现同一个功能基本就只有一种写法,所以不同的人写出来的代码都是“千篇一律”的,可以毫无障碍地阅读别人写的代码

2.Ruby。写ruby就完全是另一种感觉了。RGSS自带的还好,fiber不fiber也无所谓了,反正我自己是懂的。但是每次从网上下载别人写的脚本,总是很令人费解。因为Ruby做一件事情有多种方法,比如if可以写前面也可以写后面,比如and和&&都能表示逻辑与(虽然有微妙的区别,但是很多情况下可以通用),明明自己的语法已经支持代码块的结构了却还要支持C风格大括号;for each有N种写法;命名规则也是过于“灵活”了,方法名里面又有等号、又有问号、又有感叹号的……的确,这是一种自由。但是我觉得,如果先学习规矩,再谈自由会比较好。这样的程序员就比较自律,不容易写出您所说的“难看的实现”,写出来的代码也比较优雅。比如现在Ruby程序员基本都是先学过一门静态语言的,通常是Java或者C。

3.JS。JS的语法很奇怪,这应该没有人敢否认。比如参数数目不检查,利用函数原型实现面向对象等。虽然这些特性都有一定的道理,但是的确和绝大多数common sense的语言都是不一样的(硬要说我C本位我也没有办法,不过现在TIOBE前4的语言都是C风格)。另外,我写JS和Java用的是同一个IDE(虽然版本不同,Java的IJ是2016社区版,JS的IJ是2014 ultimate破解版),但是感觉完全不一样;JS的IDE不像写Java的时候那样智能了。同样是调用一个函数,有JSDOC的时候,它会贴心地帮我检测每一个参数的类型;没有JSDOC的时候,我把明显错误的类型传进去都不会有任何提示(比如这个函数是 fun(a,b) {return a+b;},我传进去的a是一个函数都不会有提示);至于我说过的那个events的问题,我之前没有把后面的代码打出来,因为点评有字数限制。在后面的代码中,我通过数组下标访问events;这显然是不合理的,难道数组下标能访问一个普通函数?不过这也不怪IDE,根本原因是JS语言本身

同样是MOD和插件社区,Minecraft官方没有提供任何API,完全靠modder的反编译,然后强行阅读混淆的代码进行开发(虽然有MCP这种反混淆包,但是反混淆也不完全,很多方法的参数还是乱码),已经发展出了一个庞大的MOD社区,curseforge上活跃着上千的MOD,有些MOD已经经过了5年的发展变革,仍然历久弥新;比如IndustrialCraft-2,它们的CI上已经有超过800个build版本,如果算上IndustrialCraft-1,版本数目应该已经上千了;虽然作者换了几批,这个MOD至今还在活跃更新。github甚至一度推出了Hacking Minecraft的专题,来介绍各大Minecraft相关的开源项目,比如botania、buildcraft、forestry这些开源MOD。这要归功于Java代码极高的可重用性,和一系列高效、自动化的开发工具。试想一下,RPG Maker的Ruby脚本和数据库怎么可能传到github上让大家来合作开发?RPG Maker MV的JS代码可能有这种可能性,因为数据库和脚本不再用二进制存储了,但是RGSS是永远做不到的。

以上都是我个人编写代码过程中产生的想法,但是我写过的Ruby和JS都只有几十k而已,所以不能代表这两种语言的客观情况;如果我的经历可以给准备学习这两种语言的同学提供少量参考,就已经是我的荣幸了。另外,不管RM系列用什么语言,就冲着RM自带的图形化地图编辑器和数据库,我也会坚持使用这个看起来简单低幼的游戏引擎的,估计大家也是和我一样的想法吧。
作者: taroxd    时间: 2016-4-17 10:50
gonglinyuan 发表于 2016-4-17 10:42
对不起啊,前面因为是点评有200字节限制(还是UTF-8编码的200字节,所以也就六七十个汉字),所以很多事情 ...
RPG Maker的Ruby脚本和数据库怎么可能传到github上让大家来合作开发?RPG Maker MV的JS代码可能有这种可能性,因为数据库和脚本不再用二进制存储了,但是RGSS是永远做不到的。


https://github.com/taroxd/RGSS-Taiko
作者: gonglinyuan    时间: 2016-4-17 10:55
taroxd 发表于 2016-4-17 10:50
https://github.com/taroxd/RGSS-Taiko

lib目录下的代码如果不能自动化地跑进Scripts.rxdata2里面,我个人觉得也是不够优美的吧
作者: taroxd    时间: 2016-4-17 10:59
本帖最后由 taroxd 于 2016-4-17 11:14 编辑
gonglinyuan 发表于 2016-4-17 10:55
lib目录下的代码如果不能自动化地跑进Scripts.rxdata2里面,我个人觉得也是不够优美的吧 ...


你是指什么?

自动化是指?

我倒是觉得 ruby 语言这种 require 的结构比 RGSS 从上往下执行要优美得多




绝赞跑题中
作者: LBQ    时间: 2016-4-17 11:17
本帖最后由 LBQ 于 2016-4-17 11:21 编辑

自己一写长一点的回帖就容易打自己脸,不过一想练习一下也是好的于是我就顺便说一下我个人的看法好了。

因为感觉自己只对 IDE 这部分有点感觉,所以 Fiber 的就不谈了


以下都是个人的解读,个人浅见难免会出偏差,望各位去读原文之后指出我的错误

gonglinyuan 和 LZ 说的不在一个角度

gonglinyuan 原来结论是:“没有好的 IDE”给 js

例子是:

RUBY 代码复制
  1. var events = map.events;


观点是:

“Js 本身语言导致 IDE 没法达到很高的高度”

推理是:

“Js 语法自由 -> 没有 Js 好的 IDE”

LZ 说的其实是对的, JS IDE 想要做到找到(赋值的)缺失括号的确难,但是这也最后导致了 IDE 整体质量不如 Java 这类静态语言的。

我个人在这里的观点是:Js, Ruby 的 IDE 的确整体在功能强大系数上低于 Java 的 IDE。个人在用 RubyMine, Cursive (Clojure IDE) 这类为具有强大动态拓展性语言开发的 IDE 的时候,普遍发现 IDE 在查错、重构的能力都比较弱。Intellij Idea 的 Java 基本上小型工程(我只玩过小型工程)只要 IDE 不提示有错,编译时就不会有编译错误,运行时很多错误也被提示。而 RubyMine 则很多明显的错误查不到,或者以 warning 的形式展现,但是这些都不是 IDE 本身问题而更多是语言的界限。

觉得 LZ 和 gonglinyuan 其实是有一定误解…… 不是什么大的意见分歧,gonglinyuan (个人感觉)更多的是强调语言导致的生态系统特点(比如说 RGSS 本身大家习惯性的工作环境就是 .rvdata,假如换成 .rb + require 估计很多脚本师和制作者都不会习惯吧)。
作者: 喵呜喵5    时间: 2016-4-17 12:56
gonglinyuan 发表于 2016-4-17 10:42
对不起啊,前面因为是点评有200字节限制(还是UTF-8编码的200字节,所以也就六七十个汉字),所以很多事情 ...

我有点不理解论点了

之前的帖子不是都在讨论 Ruby 本身的优点吗,为什么观点被换成 RGSS 了
因为我看到了一段烂代码,所以这个代码本身使用的语言是烂语言这样的逻辑?

Ruby 本身被设计成一门灵活的语言,所以 Ruby 的方言很多,学 C 的写出来的 Ruby 和学 python 的写出来的 Ruby 都是不同的,就连 RGSS3 本身的代码风格和设计哲学都存在细微的差异……

然而,有啥关系?不爽那些代码的话,推翻重写啊,因为 Ruby 很灵活又很多方言,从 C 来的能写出 C 程序员容易理解的 RGSS,从 Java 来的能写出 Java 的 RGSS3 ,为啥要想着看懂别人的代码呢?
作者: 浩然-Shuenhoy    时间: 2016-4-17 13:20
竞赛退役党看到这个帖子诈尸一下随便说几句

1.  我觉得原来的RGSS的脚本加载形式那个纯粹是历史遗留问题和语言无关
2.  我认为if写在前还是写在后后 用and还是&&并不会造成任何理解上的问题,因为不管哪个是符合语义的吧。。同理问号叹号等号也都是约定俗成的
当然ruby确实是不同人写的区别很大造成一些理解的区别,不过不在这一点上。不过在RGSS里没有什么太莫名其妙的吧。。。
其实最主要的是千万不要自己一个人写各种各样的形式,导致写的时候纠结半天,这个最可怕
3.  fiber或者说coroutine乃至async/await 作为一种易于理解的异步控制方法应该一种趋势吧。。。不知道比回调还有别的什么自然多少。。
4.  我小时候比较喜欢动态类型的比如lua js之类的,现在还是觉得静态类型好
5.  js的语法确实莫名其妙,尤其体现在 `[]+1` `[]*3` 这种东西上,运行时都不报错简直了。不过也不是完全没办法,js也是有一些静态分析的工具,比如flow之类的,当然现在的静态分析也很厉害了,然而我还是不想写js,一定要写的话也会写typescript。
6.  生态这个问题比较玄学我不知道怎么评论,gem npm生态算不算好?
7.  以上仅随便说一下,并没有仔细看上面几位的观点,可能文不对题或者有别的什么问题,继续潜水了
作者: gonglinyuan    时间: 2016-4-17 13:29
浩然-Shuenhoy 发表于 2016-4-17 13:20
竞赛退役党看到这个帖子诈尸一下随便说几句

1.  我觉得原来的RGSS的脚本加载形式那个纯粹是历史遗留问题和 ...

可能是我见识太少了,我最初学习到类似fiber的东西是Java Tutorial的Concurrency这一章,看到那里的时候觉得这是一个很高端的东西,想不到这么多人都觉得fiber是很基本的东西云云;看来我对语言的理解还停留在C语言的层次啊。

静态分析工具毕竟不如IDE里直接用红色波浪线标注起来来得直观。。

gem、npm这种东西和Java庞大的maven比起来真是小巫见大巫了,也许和pip还有的一战。
作者: 冷峻逸    时间: 2016-4-17 17:13
提示: 作者被禁止或删除 内容自动屏蔽
作者: soulsaga    时间: 2016-4-17 17:39
最初看到标题时..只能看到一部份..我以为是我要打十个
作者: shitake    时间: 2016-4-17 20:03
本帖最后由 shitake 于 2016-4-17 20:22 编辑

每天听着鸟鸣声入睡简直不要太爽啊囧-------来自某刚起床的渣渣


首先要说很欣慰 gonglinyuan 并没有因为我激烈的措词而生气,发展成我所担心的撕逼大战,反而很和气的交流。以及没有被大触们喷。让我先开心一下。

然后很多议点大家都有所讨论,我就不全说了。针对一些持有不同看法的事情说一说。

@gonglinyuan  

1.还是昨天关于IDE错误提示的问题

错误示范,详情看楼下

第一,我要说后边提到的用 [] 访问每报错,我在这边的RubyMine WebStorm 等上面都做了测试,皆会 warning。我觉的应该和软件的版本有很大关系。(我这边的是 Linux 发行版的最新版本)
第二,谁说 javascript 的 function 对象不能用 [] 了呢【手动斜眼
JAVASCRIPT 代码复制
  1. a = function () {};
  2. Function.__proto__ = Array;
  3. a[0]

嗯 array 换成 object 也没问题。

最后,我建议直接上最新版的webstorm写js。激活的话我这里有个服务器地址,可以在线激活。如果你是大学生有edu邮箱的话可以直接去他们家官网申请学生包。

2.不要拿npm和gem比啊混蛋!
你知道npm有多但疼么!!!你知道这玩意出点错有多难排查么,那错误信息有时候跟屎一样!虽然我不是黑,但是js的社区和ruby简直没法比啊啊!
还有 maven 不完全等同于 gem。ruby除了gem还有rake 有 bundler !他们负责了不同方向上的东西(gem和bundle基本在做差不多的事情,有人建议把这两个给合并)。关于ruby包管理的一篇文章

@taroxd

gonglinyuan 大概指的是rake、grunt、gulp这类的自动化构建工具。比如你代码写在src目录下,然后控制台运行 rmva publish ,自动把项目输出到out目录。再加个 -rvdata 参数,直接把脚本生成到scripts.rvdata 里这样的东西。

说起来,taroxd大触给我们造这么一个轮子吧,命令行解析直接上commander什么的。 233~


作者: taroxd    时间: 2016-4-17 20:15
shitake 发表于 2016-4-17 20:03
每天听着鸟鸣声入睡简直不要太爽啊囧-------来自某刚起床的渣渣


首先要说很欣慰 gonglinyuan 并没有因 ...

不需要把脚本生成到 scripts.rvdata 里这样的东西,直接把 .rb 文件保存之后打开 Game.exe 就能跑了啊。

另外,函数本来就是可以用 [] 访问的,不用改原型。
作者: 天才琪露诺    时间: 2016-4-17 22:34
woc拉下来全都看不懂@-@ 亿脸懵逼




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1