妈的,这是我这辈子见过的最恶心的代码。

2016-12-01 02:50:10 +08:00
 wdhwg001

最近在修图,听说 Photoshop 可以用 JavaScript 写脚本,于是就去看了看怎么写,觉得自己作为一个前端,总不能看不懂代码吧。

目标是对选中的所有图层和组里的所有图层应用一个动作…需求很简单,也很常见吧。

查了一下代码,对特定的一个图层应用一个动作是这样的:

var doc = app.activeDocument;
doc.activeLayer = doc.artLayers.getByName("背景色");
app.doAction("foo", "foo_folder");

感觉已经没什么好害怕的了。但是发现这样只能选一个图层或者一个组,颇为不方便,要知道 PhotoShop 是可以同时选中多个图层的,而文档里也没有说明这个功能…

于是,在继续找下去的过程中,我看到了这玩意。

function getSelectedLayersIdx() {
  var selectedLayers = new Array;
  var ref = new ActionReference();
  ref.putEnumerated(charIDToTypeID("Dcmn"), charIDToTypeID("Ordn"), charIDToTypeID("Trgt"));
  var desc = executeActionGet(ref);
  if (desc.hasKey(stringIDToTypeID('targetLayers'))) {
    desc = desc.getList(stringIDToTypeID('targetLayers'));
    var c = desc.count
    var selectedLayers = new Array();
    for (var i = 0; i < c; i++) {
      try {
        activeDocument.backgroundLayer;
        selectedLayers.push(desc.getReference(i).getIndex());
      } catch (e) {
        selectedLayers.push(desc.getReference(i).getIndex() + 1);
      }
    }
  } else {
    var ref = new ActionReference();
    ref.putProperty(charIDToTypeID("Prpr"), charIDToTypeID("ItmI"));
    ref.putEnumerated(charIDToTypeID("Lyr "), charIDToTypeID("Ordn"), charIDToTypeID("Trgt"));
    try {
      activeDocument.backgroundLayer;
      selectedLayers.push(executeActionGet(ref).getInteger(charIDToTypeID("ItmI")) - 1);
    } catch (e) {
      selectedLayers.push(executeActionGet(ref).getInteger(charIDToTypeID("ItmI")));
    }
    var vis = app.activeDocument.activeLayer.visible;
    if (vis == true) app.activeDocument.activeLayer.visible = false;
    var desc9 = new ActionDescriptor();
    var list9 = new ActionList();
    var ref9 = new ActionReference();
    ref9.putEnumerated(charIDToTypeID('Lyr '), charIDToTypeID('Ordn'), charIDToTypeID('Trgt'));
    list9.putReference(ref9);
    desc9.putList(charIDToTypeID('null'), list9);
    executeAction(charIDToTypeID('Shw '), desc9, DialogModes.NO);
    if (app.activeDocument.activeLayer.visible == false) selectedLayers.shift();
    app.activeDocument.activeLayer.visible = vis;
  }
  return selectedLayers;
};

………………

……………

…………

………

……

…那个,我盯着这堆玩意已经看了半个多小时了,有谁能看懂这堆玩意干了啥吗?

13635 次点击
所在节点    程序员
75 条回复
msg7086
2016-12-01 03:00:45 +08:00
我这有不少代码我已经来回看了几个月了,还有很多地方我完全看不懂到底干了啥。

半个小时,还好吧?
hjc4869
2016-12-01 03:04:04 +08:00
这就算恶心了?…
wdhwg001
2016-12-01 03:08:41 +08:00
@msg7086 没有办法调试, API 不一样,也没有文档说明,而且这代码写的让人根本不知道发生了啥…
反正我一步一步从头到尾看了几遍了,然而依然对这玩意到底怎么实现的毫无头绪。
ynyounuo
2016-12-01 03:17:01 +08:00
@wdhwg001
没有文档和任何注释么?
wdhwg001
2016-12-01 03:37:40 +08:00
@ynyounuo 没有,只能一次一次猜,之前有人整理过文档但是那是 5 年前的事情了,而且那些文档的网站都挂了…
lslqtz
2016-12-01 04:00:35 +08:00
hehuozhao
2016-12-01 04:09:42 +08:00
可能是自动生成的代码?
q397064399
2016-12-01 06:38:32 +08:00
其实这种代码的问题显而易见,既没有向读者展示高层次的逻辑意图,又暴露了太多的操作实现细节
sagaxu
2016-12-01 06:45:38 +08:00
我这有大量长得很像但又并不完全一样的代码,一个方法写 500 行以上很普遍,几个开发者都离职了,我一边加功能的同时还要一边梳理重构。测试人员都没有,老代码单元测试覆盖率为零。这可是每天 pv 过亿,每天净利润六位数的项目。
ryanzyy
2016-12-01 07:18:02 +08:00
你需要 console.log 每个 API 的结果 然后尝试变一些参数 对照 PS 去理解
Good Luck
pimin
2016-12-01 07:24:28 +08:00
你只知道 JS ,而不懂 PS API ,如果这都让你看懂了,大概知道怎么搬砖就盖摩天大楼咯?
valkyrja
2016-12-01 08:03:46 +08:00
不如做个动作简单粗暴
happypy1
2016-12-01 08:24:37 +08:00
@sagaxu 我懂你的苦
k9982874
2016-12-01 08:39:24 +08:00
adobe :我没给你压缩你说偷着乐吧
harry890829
2016-12-01 08:42:21 +08:00
习惯就好了,我现在处理的项目,什么利用 if 分支写死的变量,手动拼 json ,手动解析 json 什么的,简直不忍直视
everyx
2016-12-01 08:47:32 +08:00
Photoshop 是有 api 文档的,如果需要使用文档中未提及的操作,就需要使用另一个动作到处代码的工具,打开 PS 执行一个动作,他就会生成对应的代码,直接替换参数用,这些代码的确会看不懂
bigbyto
2016-12-01 08:55:31 +08:00
见过 switch 套 switch 中间还有 while 循坏和 if 判断的;还见过写 android 定义了 800 多行变量;这种看起来还行。
wyntergreg
2016-12-01 08:57:20 +08:00
你这被子还长着呢,以后还有的是更恶心的代码
aristotll
2016-12-01 08:59:29 +08:00
关键都是些 API
通用的 JavaScript 知识对阅读代码无效
Ouyangan
2016-12-01 09:03:42 +08:00
太年轻了 , 来我这看看一个屏幕看不完的 if,else

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/324464

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX