【问题标题】:Script to refactor assignment a.x=3 to setter method a->setX(3)将赋值 a.x=3 重构为 setter 方法 a->setX(3) 的脚本
【发布时间】:2016-08-24 17:32:20
【问题描述】:

我正在将部分代码从 JS 转换为 C++,因此我需要将直接实例变量赋值重构为 setter 方法:

a.xx=3;a->setXx(3);

还有getter方法:

...a.xx......a->getXx()...

目前我使用 shelljs (node.js) 进行转换。 将函数从 oldMethod() 重命名为 newMethod() 的示例命令:

sed('-i', /\boldMethod[ ]*\(/g, 'newMethod(', filename);

我最好使用与 setter/getter 相同的技术。不过我也愿意使用其他可接受的方法。

我的问题:

  1. 我无法使标记替换工作
  2. 我需要将第一个字母大写
  3. 我不确定如何为 getter 方法设置适当的条件。没有像X=Y; 这样的明确表达我不能简单地将所有alphanum.alphanum 变成吸气剂,因为它也会替换不正确的表达,例如a("foo.doo"); 我的建议:

    一个。无论如何都要手动更新不正确的替换项

    b.提供一组有效的变量名,例如"tag|possition|rotation|..."

【问题讨论】:

  • 嗯 - 我想这是您尝试在 JS 和 C++ 之间转换时遇到的最小问题!

标签: javascript c++ regex node.js shelljs


【解决方案1】:

在 C++ 中,我们不那么重视使用“getter”和“setter”,因为它们实际上只不过是在尊重封装的同时规避。

使用a->xx=3; 并没有错,因为已将xx 成员设为public。这将简化您的转换。

【讨论】:

  • a->xx = 3; 有问题:a 是指针gasp :)
  • 我明白这一点。但是我使用的是 cocos2d 框架,它在 JS 中使用 n.tag=3 但在 C++ 中需要使用 setter,因为该成员是受保护的 :-(
【解决方案2】:

我的解决方案是列举所有已知的方法。它不太灵活,但很有效。

var inf = process.argv[2];

sed('-i', /\b([a-zA-Z0-9_]+)\.tag[ ]*=[ ]*(.+);/g, '$1->setTag($2);', inf);
sed('-i', /\b([a-zA-Z0-9_]+)\.tag\b/g, '$1->getTag()', inf);

sed('-i', /\b([a-zA-Z0-9_]+)\.z[ ]*=[ ]*(.+);/g, '$1->setZ($2);', inf);
sed('-i', /\b([a-zA-Z0-9_]+)\.z\b/g, '$1->getZ()', inf);

sed('-i', /\b([a-zA-Z0-9_]+)\.pos[ ]*=[ ]*(.+);/g, '$1->setPos($2);', inf);
sed('-i', /\b([a-zA-Z0-9_]+)\.pos\b/g, '$1->getPos()', inf);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多