工作快一年了,误打误撞一头扎进SAP,用起了以前从未听过的abap语言.
abap语言就是在黑客与画家
中被Paul Graham极力挖苦的cobol语言的后代.当初看到add 1 to counter.
也是被极度震惊了,现在则更多的是麻木,因为abap语言中弱智的语法太多了.最近的项目就是扫描abap源代码,更是见识了底层的那令人震惊的语法.我在想,abap我都能用的很好,还有什么语言可以难到我?!
这里附上一段刚入门abap时写的吐槽,事实证明我当时的吐槽是对的:
ABAP吐槽!!!
学了一段时间的ABAP语法,真是对ABAP很多的语法设计无力吐槽, 今天实在忍不住了,我要吐槽!!!
ABAP的语法肯定是一个庞大团队设计的,很多地方混乱/臃肿/不明所以,和我学过其他的语言如C/C++/Java/Python/VB相比,语法真是一坨屎!!!有意思的是我列举的其他语言都是一个或几个人设计的,而ABAP,肯定是一个团队设计的.我估算ABAP基本语法是一个团队,屏幕逻辑流语法是一个团队,ABAP Object是一个团队,加上人员更迭,规范不严才导致现在这些显而易见的问题.ABAP的混乱
Function和Method的参数是极好的例子,简直非人类.import/export/importing/exporting/exception/exceptions,关键字真尼玛多啊! BUT! 不要看import就是import喔,它也可能是export,定义函数是import就是'import',调用时呢,importing就是'export'.意义相反噢,不要搞错了.从这一处的混乱可以大致猜测定义Function和调用Function的语法是由两拨人发明的,都是从自己的角度考虑问题.碰到关键字动词要考虑ing,碰到名称要考虑加不加s,真是痛苦,感觉自己不是在编程,而是在复习英语.
ABAP语法和屏幕逻辑流语法不兼容也是一个鲜活的例子.逻辑流常用的process有PBO和PAI,在PBO或PAI里调用module达到模块化的目的.调用module的是屏幕逻辑流语法,定义实现module用ABAP语法.
还有空格问题也比较混乱,不记住基本都会用错,小括号两侧要不要加空格,减号-两侧要不要加空格都是有讲究的.具体就不细说了,严重影响篇幅.ABAP的臃肿
ABAP语法中很少用到中括号或大括号(或者说没有用到?我是没见过),所以一个语法块的开始与结束就需要用end喽.而一个事件块的结束又没有end喔,当心了.
关键字暴多!ABAP的语法离了关键字完全没法活啊,极难找到哪条语句里面没有关键字啊(看了标准教程得知每条语句第一个单词必为关键字!),这些关键字还大写,还特么没有简写, 读起来用起来暴费劲! 最尼玛关键的是ABAP自带的旧版编辑器竟然没有关键字提示,不得不一个个手输啊,关键字definition/inheriting/implementation可真够长的!新版编辑器倒是提供关键字提示功能了. 可是! 可是! 用新版编辑器打开旧版编辑器创建的代码, 竟然乱码!!我靠,第一次碰到英文也乱码,public能给你整成pu /n blic,CLASS能格式化为cl /n ass,唉, 无力吐槽, 这是不是同一家公司的产品?!?!
整体语法太依赖关键字,入门虽简单但是熟悉了后会觉得很繁琐.举个栗子: 调用对象中的函数不是go_obj->create(),而是CALL METHOD go_obj->create,可是又有CALL METHOD go_obj->create(f)这样的用法,既混乱又臃肿.
在面向过程的ABAP中到处都是全局变量,为了区分所有变量的范围,在变量命名时不得人工添加gt_gs_lt_ls_gv_lv_这些前缀以增加代码可读性.ABAP的不明所以
缩写没有规范.我是没感觉到有什么规律,大部分都只能碰到一个查一下再记住,没有什么特别的缩写规律.比如说DDIC是Data Dictionary的缩写,ALV是ABAP List Viewer的缩写,tab一般是table的缩写,ref是reference的缩写.PF-status这个缩写我一直都不知道全称是什么,苦恼. 还有slis,slvc,lvc,cl,kkb什么的,都是不知全称的.
合写就更混乱了,table name可能合写为table_name/tabname/tablename,field catalog可能合写为fieldcatalog/fieldcat. 这些混乱的用法就导致碰到一个没见过的词时经常不明所以,搞不定确切含义.同时在使用没用过的功能时不能按规律的猜测,必须翻看文档,否则极易用错.