V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
garlics
V2EX  ›  程序员

一个工作了 6 年的同事写的代码,不看 git 记录我还以为是实习生写的

  garlics · 2020-09-27 09:58:01 +08:00 · 29099 次点击
这是一个创建于 1269 天前的主题,其中的信息可能已经有所发展或是发生改变。

第一次见到那么离谱的代码,完全没有封装的意思。

        if ($config['theme'] == 1) {
            if ($config['plugin']['PG_SHOPPING_CART']) {
                $tabIndex = [
                    'index' => 0,
                    'collection' => 1,
                    'bestforyou' => 2,
                    'cart' => 3,
                    'mine' => 4
                ];
                $tablist = [
                    [
                        'pagePath' => '/pages/index/index',
                        'text' => '首页',
                        'iconPath' => '/assets/images/home_unactived.png',
                        'selectedIconPath' => '/assets/images/theme1_home_actived.png',
                    ],
                    [
                        "pagePath" => "/pages/collection/collection",
                        "iconPath" => "/assets/images/collection.png",
                        "selectedIconPath" => "/assets/images/collection_actived.png",
                        "text" => "收藏"
                    ],
                    [
                        "pagePath" => "/pages/bestforyou/bestforyou",
                        "iconPath" => "/assets/images/bestforyou_unactived.png",
                        "selectedIconPath" => "/assets/images/bestforyou_actived.png",
                        "text" => "为你优选"
                    ],
                    [
                        'pagePath' => '/pages/cart/cart',
                        'text' => '购物车',
                        'iconPath' => '/assets/images/cart_unactived.png',
                        'selectedIconPath' => '/assets/images/cart_actived.png',
                    ],
                    [
                        'pagePath' => '/pages/mine/mine',
                        'text' => '我的',
                        'iconPath' => '/assets/images/mine_unactived.png',
                        'selectedIconPath' => '/assets/images/mine_actived.png',
                    ]
                ];
            } else {
                $tabIndex = [
                    'index' => 0,
                    'collection' => 1,
                    'bestforyou' => 2,
                    'mine' => 3
                ];
                $tablist = [
                    [
                        'pagePath' => '/pages/index/index',
                        'text' => '首页',
                        'iconPath' => '/assets/images/home_unactived.png',
                        'selectedIconPath' => '/assets/images/theme1_home_actived.png',
                    ],
                    [
                        "pagePath" => "/pages/collection/collection",
                        "iconPath" => "/assets/images/collection.png",
                        "selectedIconPath" => "/assets/images/collection_actived.png",
                        "text" => "收藏"
                    ],
                    [
                        "pagePath" => "/pages/bestforyou/bestforyou",
                        "iconPath" => "/assets/images/bestforyou_unactived.png",
                        "selectedIconPath" => "/assets/images/bestforyou_actived.png",
                        "text" => "为你优选"
                    ],
                    [
                        'pagePath' => '/pages/mine/mine',
                        'text' => '我的',
                        'iconPath' => '/assets/images/mine_unactived.png',
                        'selectedIconPath' => '/assets/images/mine_actived.png',
                    ]
                ];
            }
        } else {
            if ($config['plugin']['PG_SHOPPING_CART']) {
                $tabIndex = [
                    'index' => 0,
                    'cart' => 1,
                    'mine' => 2
                ];
                $tablist = [
                    [
                        'pagePath' => '/pages/index/index',
                        'text' => '首页',
                        'iconPath' => '/assets/images/home_unactived.png',
                        'selectedIconPath' => '/assets/images/home_actived.png',
                    ],
                    [
                        'pagePath' => '/pages/cart/cart',
                        'text' => '购物车',
                        'iconPath' => '/assets/images/cart_unactived.png',
                        'selectedIconPath' => '/assets/images/cart_actived.png',
                    ],
                    [
                        'pagePath' => '/pages/mine/mine',
                        'text' => '我的',
                        'iconPath' => '/assets/images/mine_unactived.png',
                        'selectedIconPath' => '/assets/images/mine_actived.png',
                    ]
                ];
            } else {
                $tabIndex = [
                    'index' => 0,
                    'mine' => 1
                ];
                $tablist = [
                    [
                        'pagePath' => '/pages/index/index',
                        'text' => '首页',
                        'iconPath' => '/assets/images/home_unactived.png',
                        'selectedIconPath' => '/assets/images/home_actived.png',
                    ],
                    [
                        'pagePath' => '/pages/mine/mine',
                        'text' => '我的',
                        'iconPath' => '/assets/images/mine_unactived.png',
                        'selectedIconPath' => '/assets/images/mine_actived.png',
                    ]
                ];
            }
        }
第 1 条附言  ·  2020-09-27 10:50:56 +08:00

觉得离谱的原因是我现在有个需求,根据$config['plugin']['PG_CATEGORY'],增加一个

[
"pagePath" => "*",
"iconPath" => "*",
"selectedIconPath" => "*",
"text" => "*"
],

发现按照他这个逻辑写简直是个灾难。

第 2 条附言  ·  2020-09-27 10:52:26 +08:00

感谢60L的老哥帮我发现了个bug

    $map = [
            'index' => [
                'pagePath' => '/pages/index/index',
                'text' => '首页',
                'iconPath' => '/assets/images/home_unactived.png',
                'selectedIconPath' => '/assets/images/home_actived.png',
            ],
            'cart' => [
                'pagePath' => '/pages/cart/cart',
                'text' => '购物车',
                'iconPath' => '/assets/images/cart_unactived.png',
                'selectedIconPath' => '/assets/images/cart_actived.png',
            ],
            'mine' => [
                'pagePath' => '/pages/mine/mine',
                'text' => '我的',
                'iconPath' => '/assets/images/mine_unactived.png',
                'selectedIconPath' => '/assets/images/mine_actived.png',
            ],
            'collection' => [
                "pagePath" => "/pages/collection/collection",
                "iconPath" => "/assets/images/collection.png",
                "selectedIconPath" => "/assets/images/collection_actived.png",
                "text" => "收藏"
            ],
            'bestforyou' => [
                "pagePath" => "/pages/bestforyou/bestforyou",
                "iconPath" => "/assets/images/bestforyou_unactived.png",
                "selectedIconPath" => "/assets/images/bestforyou_actived.png",
                "text" => "为你优选"
            ]
        ];
        $tab = ['index'];
        if ($config['theme'] == 1) {
            $tab[] = 'collection';
            $tab[] = 'bestforyou';
        }
        if ($config['plugin']['PG_SHOPPING_CART']) {
            $tab[] = 'cart';
        }

        $tab[] = 'mine';
        $tabIndex = array_flip($tab);
        $tablist = array_map(function ($v) use ($map) {
            return $map[$v];
        }, $tab);
        if ($config['theme'] == 1) {
            $tablist[0]['selectedIconPath'] = '/assets/images/theme1_home_actived.png';
        }
第 3 条附言  ·  2020-09-27 13:45:20 +08:00

如果他是这样写的,我估计还不会说什么,最多就默默改了,毕竟一屏也能把逻辑看完,也算逻辑清晰了。

$tabCart =  [
    'pagePath' => '/pages/cart/cart',
    'text' => '购物车',
    'iconPath' => '/assets/images/cart_unactived.png',
    'selectedIconPath' => '/assets/images/cart_actived.png',
];
if (something) {
    $tablist = [$tabCart];
}

他这一屏都看不完一个if块的,真的不能忍。

298 条回复    2020-09-29 16:01:21 +08:00
1  2  3  
sunziren
    201
sunziren  
   2020-09-27 16:38:15 +08:00
尴尬
soulmt
    202
soulmt  
   2020-09-27 16:43:11 +08:00
@garlics 我也挺意外的...甚至有点可怕。
prime2015
    203
prime2015  
   2020-09-27 16:44:29 +08:00
@reus 很多事情是守恒的,代码越优雅抽象,可读性越差
soulmt
    204
soulmt  
   2020-09-27 16:45:03 +08:00
@wangyzj 为什么复制粘贴的代码处理一下就成了过度封装呢?好奇。 难道封装就不能变得简单高效?这么说的话,封装那岂不是个笑话
ardenchan
    205
ardenchan  
   2020-09-27 16:48:13 +08:00
这不就是下面的固定导航栏吗?不基本都是写死的吗?这种你还要去封装?
reus
    206
reus  
   2020-09-27 16:50:34 +08:00   ❤️ 2
@prime2015 谁和你说引入多一个抽象了?$tablist 里面那么多重复的对象,抽出来几个变量,再将变量组合成数组,不是更好读?这种 if 和对应的 else 隔了几十行的代码,居然有人说可读,可笑!
应该这样写:
$indexTab = ...
$collectionTab = ...
$bestForYouTab = ...
if ... {
if ... {
$tablist = [$indexTab, collectionTab, ...]
} else {
$tablist = ...
}
} else {
$tablist = ...
}

没有引入抽象层,但是显然更好读,而且需要改动时,也不容易出错,也不用复制粘贴

就原来那代码的水平,连不重复都没做到,谈什么抽象?
OnlyShimmer
    207
OnlyShimmer  
   2020-09-27 16:52:11 +08:00   ❤️ 8
我默默的打开 git 查看了我接手前同事的一个项目( vue )
https://imgchr.com/i/0kas9P
这是一份表单提交,初略估计大概有 20 几个 if 判断
这还不是最神奇的,最神奇的是他的 css 骚操作
https://imgchr.com/i/0kay1f
他是一个一个数着写的,我真不明白写一个 class 这么难吗
https://imgchr.com/i/0kBEE4
他另一个骚操作就是把省市区写到的 data 里面
吾辈楷模
Mindjet
    208
Mindjet  
   2020-09-27 16:53:24 +08:00
感觉大部分人都没有指出「房间里的大象」。

如果看过《代码整洁之道》(豆瓣评分 8.6),就应该理解类似的说法,短函数是非常重要的,作者欣赏的函数是那种只有 2~5 行的,最多不超过 20 行。

> 函数的第一规则是要短小。第二条规则是还要更短小。我无法证明这个断言。我给不出任何证实了小函数更好的研究结果。我能说的是,近 40 年来,我写过各种不同大小的函数。我写过令人憎恶的长达 3000 行的厌物,也写过许多 100 行到 300 行的函数,我还写过 20 行到 30 行的。经过漫长的试错,经验告诉我,函数就该小。(第 3 章 函数 - 3.1 短小)
> ...
> 这个程序中每个函数都只有两行、三行或四行长。每个函数都一目了然。每个函数都只说一件事。而且,每个函数都依序把你带到下一个函数。这就是函数应该达到的短小程度!(第 3 章 函数 - 3.1 短小)

当然你也能轻松找到很多反例,这只是经验之谈,这个经验既不清晰也不严格,但这的确是部分人的想法,而且还写在书里了。我很欣赏的是这个人能很清楚的看到这一点,不清楚后续有没有实证研究。



PS:前提就是那个代码是人写的,而不是生成的,如果是的话,那可能是个很「好」的代码。
Niphor
    209
Niphor  
   2020-09-27 17:04:59 +08:00
我想说 要是 突然来个需求
>PC 模式 mine 显示提第一位,但是 theme==1 时 bestforyou 显示在 mine 前面
楼主的 优化版本该怎么办
NjcyNzMzNDQ3
    210
NjcyNzMzNDQ3  
   2020-09-27 17:05:55 +08:00
改了下玩玩,不喜勿喷 QWQ

function get_open_theme_shipping_cart_data(){
$tabIndex = [
];
$tablist = [
];

return [
$tabIndex,
$tablist
];
}
function get_open_theme_shipping_cart_default_data(){

}

if ($config['theme'] == 1 && $config['plugin']['PG_SHOPPING_CART'] === true) {
list($tabIndex, $tablist) = get_open_theme_shipping_cart_data();
}
if ($config['theme'] == 1 && $config['plugin']['PG_SHOPPING_CART'] === false) {
list($tabIndex, $tablist) = get_open_theme_shipping_cart_default_data();
}
if ($config['theme'] != 1 && $config['plugin']['PG_SHOPPING_CART'] === true) {
list($tabIndex, $tablist) = xxx();
}
if ($config['theme'] != 1 && $config['plugin']['PG_SHOPPING_CART'] === false) {
list($tabIndex, $tablist) = xxx();
}
anxiousPumpkin
    211
anxiousPumpkin  
   2020-09-27 17:06:26 +08:00
@zhangjiafan 说的是义正严辞。楼主发了一段代码让你来评论,你强行加了一大段主观臆想,你搁着演情景剧呢?💩代码就是💩代码,对自己的产出这么不负责??
NjcyNzMzNDQ3
    212
NjcyNzMzNDQ3  
   2020-09-27 17:08:50 +08:00
@tabris17 #5 请不要黑语言,这是逻辑问题
CoderLife
    213
CoderLife  
   2020-09-27 17:13:06 +08:00
见啥都封:
那如果我只想改:
$config['theme'] == 1)
且:
$config['plugin']['PG_SHOPPING_CART']
条件"我的"的 icon 怎么改?
wangyzj
    214
wangyzj  
   2020-09-27 17:15:03 +08:00
@soulmt #204 我只是不建议过度封装,不是说不封装
matatabi
    215
matatabi  
   2020-09-27 17:21:10 +08:00
快向老板举报,把这垃圾踢出你们的公司 (¬_¬)
FaXiaoKe
    216
FaXiaoKe  
   2020-09-27 17:28:14 +08:00   ❤️ 1
还有时间在这里晒??

赶紧重构啊,加班加点给他全部替换了。

(¬_¬)另外,你确定是准二手代码??

保不齐是四五手代码了。。
zpfhbyx
    217
zpfhbyx  
   2020-09-27 17:33:11 +08:00
@CoderLife $map = [
'index' => [
'pagePath' => '/pages/index/index',
'text' => '首页',
'iconPath' => '/assets/images/home_unactived.png',
'selectedIconPath' => '/assets/images/home_actived.png',
],
'cart' => [
'pagePath' => '/pages/cart/cart',
'text' => '购物车',
'iconPath' => '/assets/images/cart_unactived.png',
'selectedIconPath' => '/assets/images/cart_actived.png',
],
'mine' => [
'pagePath' => '/pages/mine/mine',
'text' => '我的',
'iconPath' => '/assets/images/mine_unactived.png',
'selectedIconPath' => '/assets/images/mine_actived.png',
],
'collection' => [
"pagePath" => "/pages/collection/collection",
"iconPath" => "/assets/images/collection.png",
"selectedIconPath" => "/assets/images/collection_actived.png",
"text" => "收藏"
],
'bestforyou' => [
"pagePath" => "/pages/bestforyou/bestforyou",
"iconPath" => "/assets/images/bestforyou_unactived.png",
"selectedIconPath" => "/assets/images/bestforyou_actived.png",
"text" => "为你优选"
]
];
$tabConfig = array(
'1'=>array( //theme
'PG_SHOPPING_CART'=>array(
'index' => array(),
'collection' => array(),
'bestforyou' => array(),
'cart' => array(),
'mine' => array()
),
'default'=>array(
'index' => array(),
'collection' => array(),
'bestforyou' => array(),
'mine' => array()
)
),
'default'=>array(
'PG_SHOPPING_CART'=>array(
'index' => array(),
'cart' => array(),
'mine' => array()
),
'default'=>array(
'index' => array(),
'mine' => array()
)
)
);
//$config['plugin']['PG_SHOPPING_CART'] = 'PG_SHOPPING_CART';
$themeTabConfig = $tabConfig[$config['theme']]??$tabConfig['default'];
$lastTabConfig = $themeTabConfig[$config['plugin']['PG_SHOPPING_CART']]??$themeTabConfig['default'];
foreach($lastTabConfig as $key=>$icon){
$lastTabConfig[$key] = array_merge($map[$key],$icon);
}
return $lastTabConfig;
a719031256
    218
a719031256  
   2020-09-27 17:33:55 +08:00   ❤️ 4
@Mindjet 我个人觉得短函数就是超级坑人的,最近在翻终端底层图形库,c 语言的代码,每个函数都很短,但 tm 的一个函数嵌套几个函数,每次梳理逻辑走着走着就找不到方向了,我忘了我上一个函数是那个了,因为打开的文件很多,标签页都要满了
wjfz
    219
wjfz  
   2020-09-27 17:38:41 +08:00   ❤️ 1
最怕那种抄起 IDE 一把梭,一天写完所有接口。
然后跟在后面擦屁股擦好几天。review 代码一下都能找出来十几二十个 bug 。
djoiwhud
    220
djoiwhud  
   2020-09-27 17:41:23 +08:00   ❤️ 6
@soulmt 我工作快 10 年了,啥垃圾代码没接触过,也管理了几年团队了。我连 1999 年创建的工程,交接 N 代之后连代码都交接失踪了的 PC 软件都维护过。新手最喜欢干的事情就是推翻重来,网晒代码批斗,寻求群体认可。

你所谓的维护老代码跳脚,仅仅是你自我感觉良好。长周期的项目,业务代码,正常人连读一个特殊需求的 for 循环的耐心都没有,最好全部都是这个作者批斗的那种直白代码。
Mindjet
    221
Mindjet  
   2020-09-27 17:46:58 +08:00
@jackrelative #220
看到你说的那种情况,我猜测有部分人会将读不懂他人的代码,归结到「他人写的烂」上头,实际上阅读他人的代码本来就是个很难的事情。当然,如果遗留代码有文档有测试,风格良好可能会有助于阅读,但不能忽略处理遗留代码本身的难度就很大。
tiedan
    222
tiedan  
   2020-09-27 17:50:17 +08:00   ❤️ 1
这代码离谱,review 绝对不给他过
Mindjet
    223
Mindjet  
   2020-09-27 17:54:54 +08:00   ❤️ 1
@a719031256 #218
举出反例总是轻而易举,在软件开发这个行当,积累了些经验并写在了书里,除了那些算法什么的,或者其他的用数学证明的,大多数的经验都没有用科学手段去验证,这是个很大的问题。我只零零星星的听别人提到过引用实证研究的事情,但从来没在这些出名的书中见到过。

《‪软件困局:为什么聪明的程序员会写出糟糕的代码》,好像说的就是这个事情,当然我没有把这本书看完,只是看完前言(序章)后有这种感觉。

> 软件工程其实并没有多少“工程”的成分,这已经是公开的秘密了。
> ...
> 自计算机诞生以来,特别是 20 世纪 60 年代大批软件问世之后,围绕软件的种种问题一直伴随且困扰着从事软件生产和研究的人们。... 在大学里,学生并没有学到在团队中如何编写便于后续维护的软件,他们在大学里完成的软件作业仅达到了课程项目的要求,却与业内软件开发的实际规模和真实复杂度完全脱节 ;另一方面,在工业界,靠自学成长起来的一代聪明的程序员习惯于凭自己的直觉和经验来解决问题,他们相信软件必然会包含 bug,但这些包含了 bug 的软件照样可以带来巨大财富,这些根深蒂固的观念导致工业界缺乏改进软件工程的动力。
> ...
> 但是,编写软件却不是这样的。虽然软件被称为工程学科,但它几乎没有工程的特征,即随着时间的推移,在严格的实验基础上建立起一个知识体系。人们自然会问关于工程产品的那些问题:它有多坚固?可以使用多久?什么情况下可能失败?对于软件来说,无论是针对程序的一个部分还是整个软件,这些问题都无法得到可靠的答案。专业许可是大多数工程学科的标志,但这却被软件行业视为潜在的诉讼来源,而不是制定标准的机会。
> ...
> 早在 1990 年 11 月,卡内基–梅隆大学的玛丽·肖( Mary Shaw )为《 IEEE 软件》杂志撰写了一篇题为《软件工程学科的前景》的文章,她解释说:“工程依赖于有关技术问题领域的、以实践者可以直接使用的方式编纂的科学知识,从而为实践中常见的问题提供答案。普通的工程师可以用这些知识来更快地解决问题。这样一来,工程部门就可以共享先前的解决方案,而不是总依赖于某个行家的问题解决方案。”
> ...
> 她将软件工程与土木工程进行了比较,并指出,“尽管大型土木结构在有历史记载之前就已经建成,但在过去的几个世纪里,它们的设计和建造都是基于理论知识,而不是凭直觉和积累的经验 。”1 我翻阅了美国土木工程师协会的出版物目录,其中尽是有趣的标题,如《水管情况评估》和《寒冷地区路面工程》,我很欣赏在其他工程学科中有这么多的理论知识。

我感觉之所以会出现这种现象,就是因为软件「工程」太想成为「工程」了,这个领域的很多经验都直接和人相关,而不是跟什么物理化学研究的对象相关,那么研究的方法就应该参考社会科学,而不是工程学甚至是数学。
jinhan13789991
    224
jinhan13789991  
   2020-09-27 18:03:24 +08:00   ❤️ 3
你有没有想过,一开始没有这么多判断,只有一种场景。
后来需求变化,但是也不过两种情况,所以添加一个 if else 就解决了。
后面随着版本需求迭代,场景越来越多,项目赶进度,各种需求都是力求尽快的完成。 这个时候最快的解决方法就是增加一个 if else,把上面的内容拷贝复制然后改一下。1-2 分钟就搞定了。
而如果重构,可能就是半小时起步了,该完后还要测试,对以前的各种场景进行测试等等。如果某处不小心改出了 bug,那就是很麻烦的事情。

最最最重要的是,在很多公司,重构优化项目不加 kpi 的。改的好没人理会,改出问题就都是你的锅了。
soulmt
    225
soulmt  
   2020-09-27 18:22:50 +08:00   ❤️ 5
@jackrelative 你错了,我不是新手,但是我工作也 4 年了,我从来不喜欢推翻重来,反而我用范围重构的方式优化了不少大的项目,我来说说为什么我觉得这个代码垃圾,你也说了,一个特殊需求的 for 循环的耐心都没有,为什么会没有耐心?因为懒, 随便拉出来一个没有核心逻辑的代码,屁屎尿流的全部堆砌上去,谁愿意看,这就跟有主题思想的作文跟记流水账的作文一样,叙的一件事,有些就是字里行间透露着浅显易懂的东西, 为什么有组件库,sdk, 丰富的包在流通吗?因为大家都懒,懒的看到底是什么逻辑直接用就好了,当然你会告诉我,那些都不是业务代码,通用性的东西当然可以封装, 但是谁说业务代码就不能封装呢?封装把握好度就好来,况且没有业务何谈通用?哪个不是业务提炼出来的???当然我也不提倡步步为营,每一步都要考虑,这就是过度思考了,但是小技巧有大作用的东西,往往让代码简单有效。我觉得很多人为了杠而杠,优秀的代码往往是 1 行顶好几行,但是谁规定优秀的代码就是难懂的?过滤写 for 循环好还是用 Array.filter 好? Array.filter 是不是对 for 循环的封装?难道大家好的方法都不要用,全部 for 循环怼上去才是简单易懂的代码??当然这完全靠个人能力,没有这种意识和能力的去胡乱封装,也是会造成大麻烦,如果你们认为封装带来的是难懂,复杂的代码,说明你们根本没想过怎么更好的封装,或者没有那能力。
tabris17
    226
tabris17  
   2020-09-27 18:23:17 +08:00
@NjcyNzMzNDQ3 为什么不封装就是「黑」?请先说明这个逻辑吧
alan0liang
    227
alan0liang  
   2020-09-27 18:27:40 +08:00 via Android
我们学校某个答题小程序源代码:
https://i.loli.net/2020/09/27/V9q1ADKUBmXExzN.jpg
wx:if="{{item.optionnumber==2}}"
wx:if="{{item.optionnumber==3}}"
一直到
wx:if="{{item.optionnumber==12}}"

看多了就习惯了……
soulmt
    228
soulmt  
   2020-09-27 18:27:43 +08:00
@jinhan13789991 但是你有没有想过,在下手之前就动动脑袋思考维护性避免这种写法,是不是就不会有这么长无用的代码??你们都说复制粘贴才是尽快完成 ? 当这里面慢慢变成 10 个 20 个的时候 还有尽快这么一说吗?
a719031256
    229
a719031256  
   2020-09-27 18:33:38 +08:00
@Mindjet 书这东西就是把简单的东西写得超级复杂,我看游戏引擎架构,FreeBSD 实现,还有 c++经典几套书籍后感觉真的是这个道理,太痛苦了,看完了还得自己去梳理总结,还不如翻翻博客看看别人的开发经验之谈来得实在,有时候觉得写书的人有点脱离实际情况了
mrkelly
    230
mrkelly  
   2020-09-27 18:38:57 +08:00
@soulmt 有个时间和成本动态平衡。。我当年就重构过很多不好的代码哎.... 当时确实是内心在咒骂.... 多了就。。习惯了
godblessumilk
    231
godblessumilk  
   2020-09-27 18:44:11 +08:00 via Android
茴香豆要搞个多少种写法??
haohappy
    232
haohappy  
   2020-09-27 18:44:59 +08:00   ❤️ 3
这么喜欢喷人 一会 6 年 一会实习生 一会不能忍 显得自己很生气的样子 不知道楼主什么学历? 看到很多喷同事的。。有点好奇
说实话我的看法:他写得很烂 但你的并不如他 还需优化

不知道是哪个大 V 带头喷了下 if else 个人看法:你没那水平抽象封装,还是老老实实地 if else 吧,至少不给别人挖坑
UnderTakerMS
    233
UnderTakerMS  
   2020-09-27 18:47:22 +08:00 via Android
手机党看得眼睛都快瞎了
soulmt
    234
soulmt  
   2020-09-27 18:54:27 +08:00
@mrkelly 这倒是,不过我们公司还好,我会申请代码优化的时间
xiangbohua
    235
xiangbohua  
   2020-09-27 18:57:08 +08:00 via iPhone
我觉得封装的前提是可以复用以及提高复杂逻辑的可读性。否则就无所谓了
tydl
    236
tydl  
   2020-09-27 19:30:22 +08:00
@OnlyShimmer 不出意外的话,这是 VUE 前端
oldhorse
    237
oldhorse  
   2020-09-27 19:31:38 +08:00
清晰易懂。虽然好像确实不太优雅
dobelee
    238
dobelee  
   2020-09-27 19:39:07 +08:00 via iPhone
@tabris17 #5 你可真是个人才。
charlie21
    239
charlie21  
   2020-09-27 19:39:34 +08:00 via iPhone   ❤️ 4
如果以 “小学生看得懂的代码就是没问题的代码” “能跑就行的代码就是没问题的代码” 为标准,
那么 “编码规范” 这个东西也就不用存在了

https://github.com/google/styleguide
https://github.com/airbnb/javascript

公司项目里连 “变量应如何命名” 都是有规范的,不按规范写 第二天别来了

当自己写作业呢?瞎划啦两笔交工就完事了
小至 coding convention,style guide,编码规范阿,大至最佳实践,特定问题的通行解法,当摆设?不懂可以学阿。

不想学阿,“能跑就行” 阿,滚蛋吧
哪里要你你就去哪 ...
cokyhe
    240
cokyhe  
   2020-09-27 19:48:49 +08:00
有的时候老板不给时间,也只能这么堆砌代码了,反正又不会一直在这个公司干下去
soulmt
    241
soulmt  
   2020-09-27 20:00:28 +08:00
@charlie21 对啊,技术也不要进步了,搞那么多好用的东西干什么,大家都用原始的写法往上堆把,多好。简单易懂,各平台通用,谁都看得懂,一把梭就对了。
geying
    242
geying  
   2020-09-27 20:07:05 +08:00   ❤️ 1
又不是不能用.jpg
gravitybox
    243
gravitybox  
   2020-09-27 21:04:23 +08:00
觉得逻辑不是很复杂,就是写死在代码中的配置看着不太间接。如果是从数据存储加载配置,整个逻辑应该会清晰很多。
levelworm
    244
levelworm  
   2020-09-27 21:07:34 +08:00 via Android
实习生其实反而可能比较注意这个
abcbuzhiming
    245
abcbuzhiming  
   2020-09-27 21:47:55 +08:00   ❤️ 3
作为一个已经写了 10 年的人,我得说,非长期性的,大型项目,动不动把封装搬出来是有毛病。
GiantHard
    246
GiantHard  
   2020-09-27 22:12:56 +08:00   ❤️ 1
@a719031256 代码量大的话,长函数也很容易让人梳理着梳理着就找不到回去的路的。其实这个所谓的“短函数更好可以从复杂度来看待”,Sonar Lint 里面有个“认知复杂度”的检查项,长函数往往容易写成认知复杂度很高的样子,再加上函数内部变量在几百行、甚至上千行的代码里面到处被引用,这样后续修改维护起来真的是非常的痛苦。
ooee2016
    247
ooee2016  
   2020-09-27 22:22:27 +08:00
很多时候就是临时让加,也没那么多时间每个都考虑下怎么优化,咔咔 if else 复制粘贴 5 分钟搞定.
ruandao
    248
ruandao  
   2020-09-27 22:34:29 +08:00
其实有时候会接受这样的代码
因为,开发很多都在赶工,有时候,小朋友只懂得套模板,嵌套太多层并不好

看你是愿意牺牲休息时间去教还是愿意直接扔给他套模板
至于招厉害点的,预算就那么多。。。
salmon5
    249
salmon5  
   2020-09-27 22:46:04 +08:00
如果是 9106,写的代码不好可以理解;就怕有人 955,代码质量不行。
ajaxfunction
    250
ajaxfunction  
   2020-09-27 23:35:50 +08:00
这很明显就是首次写代码,根本没有提到会有新皮肤功能,
某天需要加一个节日换皮肤,于是加了一个 if else
过某个节日又要加一个皮肤 于是再次 else if
直到节日越来越多,if else 皮肤就更多了

至于你说封装的事? 用 php 肯定公司规模肯定不算大,明天活动就上线了,今天还在筹备活动代码,哪有人手和时间优化封装啊?
anerevol
    251
anerevol  
   2020-09-27 23:42:13 +08:00
// 不同主题的配置最好分开
$themeAllTabs = [
'default' => [
'index' => [
'pagePath' => '/pages/index/index',
'text' => '首页',
'iconPath' => '/assets/images/home_unactived.png',
'selectedIconPath' => '/assets/images/home_actived.png',
],
'cart' => [
'pagePath' => '/pages/cart/cart',
'text' => '购物车',
'iconPath' => '/assets/images/cart_unactived.png',
'selectedIconPath' => '/assets/images/cart_actived.png',
],
'mine' => [
'pagePath' => '/pages/mine/mine',
'text' => '我的',
'iconPath' => '/assets/images/mine_unactived.png',
'selectedIconPath' => '/assets/images/mine_actived.png',
]
],
1 => [
'index' => [
'pagePath' => '/pages/index/index',
'text' => '首页',
'iconPath' => '/assets/images/home_unactived.png',
'selectedIconPath' => '/assets/images/theme1_home_actived.png',
],
'collection' => [
"pagePath" => "/pages/collection/collection",
"iconPath" => "/assets/images/collection.png",
"selectedIconPath" => "/assets/images/collection_actived.png",
"text" => "收藏"
],
'bestforyou' => [
"pagePath" => "/pages/bestforyou/bestforyou",
"iconPath" => "/assets/images/bestforyou_unactived.png",
"selectedIconPath" => "/assets/images/bestforyou_actived.png",
"text" => "为你优选"
],
'cart' => [
'pagePath' => '/pages/cart/cart',
'text' => '购物车',
'iconPath' => '/assets/images/cart_unactived.png',
'selectedIconPath' => '/assets/images/cart_actived.png',
],
'mine' => [
'pagePath' => '/pages/mine/mine',
'text' => '我的',
'iconPath' => '/assets/images/mine_unactived.png',
'selectedIconPath' => '/assets/images/mine_actived.png',
]
]
];

$themeDisplayTabs = [
'default' => [
'index',
'mine'
],
1 => [
'index',
'collection',
'bestforyou',
'mine'
]
];

$themePluginActions = [
'default' => [
'PG_SHOPPING_CART' => function($tabs) {
array_splice( $tabs, 1, 0, 'cart');
return $tabs;
}
],
'1' => [
'PG_SHOPPING_CART' => function($tabs) {
array_splice($tabs, 3, 0, 'cart');
return $tabs;
}
]
];

$theme = $config['theme'] == 1 ? 1 : 'default';
$tabNames = $themeDisplayTabs[$theme];
foreach($config['plugin'] as $plugName => $available) {
$plugAction = $themePluginActions[$theme][$plugName] ?? null;
if ($available && $plugAction != null) {
$tabNames = $plugAction($tabNames);
}
}

$tabIndex = array_flip($tabNames);
$tablist = array_map(function ($tabName) use ($theme, $themeAllTabs) {
return $themeAllTabs[$theme][$tabName];
}, $tabNames);
mht
    252
mht  
   2020-09-27 23:53:47 +08:00
这代码的确有优化下的余地 太难看了 强迫症很难受啊
falcon05
    253
falcon05  
   2020-09-28 00:02:37 +08:00 via iPad
这种导航 /菜单的设定在 wordpress 里都成了一个内置的功能,灵活性非常强
sorshion
    254
sorshion  
   2020-09-28 00:10:51 +08:00
如果只是完成业务,那这个代码没毛病,如果想要自身再精进些,那么就需要改进。
mulog
    255
mulog  
   2020-09-28 03:14:37 +08:00
我本来没仔细看代码 爬楼看评论说呀为了实现功能啊能跑就行啊觉得还挺有道理
回头看了一眼代码,这也实在太过分了。。
594duck
    256
594duck  
   2020-09-28 03:17:10 +08:00 via iPhone   ❤️ 2
@jackrelative 老哥说的靠谱,奋斗小年轻们都觉得自己天下第一,要吃过两次憋后还不一定学会。觉得是老东西们坑害自己,要跳到创业公司去,再被好好教育下才能认清本质。

就像小年轻觉得最新语言才能解决问题,而殊不知软件工程师系统工程。那帮奋斗小年轻们就喜欢看着诸如
“微软这臭傻逼写出来的代码连我不入,微软的实习生写出来的臭傻逼代码也能发布,连我不如”

问题是人家从系统整体上来看。

我见过很小的一个系统 3 台 vm 搞定的,硬是给你弄 k8s 。还要自建,最后玩出了 8 台 vm 。然后建立一写跳槽跑路。
594duck
    257
594duck  
   2020-09-28 03:22:25 +08:00 via iPhone
顺便我这里哪怕不友好都要说一下

站楼主的都是那些“二次元头像”居多,就和 twitter 上一样奇怪的。
594duck
    258
594duck  
   2020-09-28 03:29:15 +08:00 via iPhone
@reus
@Nicoco

2 位大佬希望你们在日后的日子能被人用“同样的态度”,“积极对待”。

为了能够关注你们日后的日子我已经加了你们的特别好友。


为了能了解两位日后的日子,我会多给两位奋斗着点赞保持你们有足够的 v 币
good1uck
    259
good1uck  
   2020-09-28 04:30:59 +08:00 via Android
@skinny 您说的是哪类程序员?这里面主要分为两类,一类支持楼主,另一类不支持
catcn
    260
catcn  
   2020-09-28 06:38:44 +08:00
一看,原来是 php 大法。。
jinhan13789991
    261
jinhan13789991  
   2020-09-28 07:44:12 +08:00 via Android
@soulmt 所以说要结合实际情况啊,要是自己的项目,肯定各种优化。
对于一个有历史包袱的项目,最好的方法是不动他,除非出 bug.
xuanbg
    262
xuanbg  
   2020-09-28 08:42:50 +08:00
@cokyhe 复制粘贴一次 2 分钟,照这样算的话,一天复制粘贴足足 240 次呢!我就不信没有重构代码的 1 小时时间。

再说,下个项目复制粘贴这次重构后的代码不香吗?

反正我写的那些 crud 项目,都是整个复制,稍稍改动下代码,重写 sql 就完成了。不说一天写完全部接口,有个 3 天的时间基本代码就写完了。反而在这之前,要花好几倍的时间做需求分析和流程梳理。
liuky
    263
liuky  
   2020-09-28 08:52:36 +08:00
一个页面后台代码 4000+ 行代码, 我骄傲了么, 真是的
lg106
    264
lg106  
   2020-09-28 08:58:24 +08:00
我就是要因为考虑太多,被老板批,他说能用就好,坑以后再补
HenryWang0723
    265
HenryWang0723  
   2020-09-28 09:04:00 +08:00
看完评论考虑转行了,这行业已经内斗到这个程度了,机会太少了。。。
TomVista
    266
TomVista  
   2020-09-28 09:13:00 +08:00
代码写的不差,当然也谈不上好,确实没有什么封装,去重.
这就是一段很普通的,可以改进的代码,满分 100 给个 70 分完全没问题.
写成这样,其实没什么可喷的.
你可能没有被施加过魔法的代码吊打过.
linZ
    267
linZ  
   2020-09-28 09:18:48 +08:00
@kemikemian 我还是蛮疑问,重构到底该是什么,单纯把一坨代码搬到另一个地方么。。
yogogo
    268
yogogo  
   2020-09-28 09:20:49 +08:00
没觉得你这样优化能带来什么好处,反而还要想逻辑。要是突然有一天,其中的一个判断需要做成其他需求,估计你这个逻辑还要重新改动。
Nuttertoo1s
    269
Nuttertoo1s  
   2020-09-28 09:22:30 +08:00
如果不是为了赶时间,谁不愿意让自己代码好看一点
linZ
    270
linZ  
   2020-09-28 09:22:56 +08:00
@jadehare 10 多个判断,if 两三层,文件 3000 行起,然后有三四个文件都差不多又有一点点区别。最后就是我说的这种结果。
a719031256
    271
a719031256  
   2020-09-28 09:36:26 +08:00
@charlie21 之前公司也是搞代码规范,后来为了代码整洁,整个项目都延期了,最后老板贴起脸去找客户延长时间,现在这家公司也是同样的情况,只是在中后期会专门腾出时间整理代码,添加注释,在开发中不会去特意在意代码规范,只有遵守基本的开发规范,实际开发情况很复杂不是一两本书就能定论的,除非这家公司有钱折腾,否则一般公司如果严格规范的话,公司极有可能倒闭
treblex
    272
treblex  
   2020-09-28 09:39:05 +08:00
所有页面存库
再建一个表存主题模式和页面 ids,
设置页面选择当前主题

想偷懒的话 可以直接用广告位系统的,加个全局设置就行来
a719031256
    273
a719031256  
   2020-09-28 10:02:01 +08:00
@GiantHard 写或改长函数我不知道轻不轻松,但我知道看长函数肯定比看短函数容易,因为不管怎么跳转,我都能回到初始函数的位置,再不济做个注释标注一下,写和改那个我不太清楚,我写得最长的是一个是 2000 行的 html 文件,一个纯 js 的大图页面,,不过用折叠功能还算好把,主要是注释写得太多了,纯代码才 1300 多行
a719031256
    274
a719031256  
   2020-09-28 10:07:46 +08:00
@GiantHard 公司死活不用 vue 分离式框架,非要让后端写页面,在百度地图上展示各种效果,然而百度地图的 js 看代码风格也是后端写的吧
c466934322
    275
c466934322  
   2020-09-28 10:12:46 +08:00
插一脚:我只希望你封装完成之后,你的封装能够应对 老板晚上 9 点提的需求。
soulmt
    276
soulmt  
   2020-09-28 10:13:24 +08:00
@a719031256 有空多看看源码吧,且不说业务相关,单从代码结构,你这个代码堆在一个函数里面的行为,我无法苟同。源码也有很长的代码,但是按照你的写法,把很长的代码扩展开,可能比你一个文件都长。
a719031256
    277
a719031256  
   2020-09-28 10:17:21 +08:00
@soulmt 这个活我就不想接,哪有后端去写前端效果的,还是 js 版本,另外是 html......
a719031256
    278
a719031256  
   2020-09-28 10:19:15 +08:00
@soulmt 目前就在看 curses 库,研究 FreeBSD 系统源码,感觉或许我需要一个好点的 ide 工具来跳转代码,免得我又迷路了
Drc
    279
Drc  
   2020-09-28 10:55:01 +08:00
确实,你要他封装还会把各种业务逻辑糅进去,我都怀疑是不是年龄越大写的越随意
lovecy
    280
lovecy  
   2020-09-28 10:56:07 +08:00
上手写了一下发现原有的代码确实搞笑,基本的不重复都没做到,应该很多觉得可以这么写的是跟我一样没有自己动手吧?我优化如下
1 $tabMap = [
2 'index' => [
lovecy
    281
lovecy  
   2020-09-28 11:00:02 +08:00
#280
1$tabMap = [
2 'index' => [...],
3 'index_theme_1' => [...],
4 'collection' => [...],
5 'bestforyou' => [...],
6 'cart' => [...],
7 'mine' => [...]
8];
9if ($config['theme'] == 1) {
10 if ($config['plugin']['PG_SHOPPING_CART']) {
11 $tabIndex = ['index_theme_1', 'collection', 'bestforyou', 'cart', 'mine'];
12 } else {
13 $tabIndex = ['index_theme_1', 'collection', 'bestforyou', 'mine'];
14 }
15} else {
16 if ($config['plugin']['PG_SHOPPING_CART']) {
17 $tabIndex = ['index', 'cart', 'mine'];
18 } else {
19 $tabIndex = ['index', 'mine'];
20 }
21}
22
23$tablist = array_map(function ($tabName) use ($tabMap) { return $tabMap[$tabName];}, $tabIndex);
lovecy
    282
lovecy  
   2020-09-28 11:01:14 +08:00
#280,#281,V 站应该来一个代码模式。。。
$tabMap = [
'index' => [...],
'index_theme_1' => [...],
'collection' => [...],
'bestforyou' => [...],
'cart' => [...],
'mine' => [...]
];

if ($config['theme'] == 1) {

if ($config['plugin']['PG_SHOPPING_CART']) {
$tabIndex = ['index_theme_1', 'collection', 'bestforyou', 'cart', 'mine'];
} else {
$tabIndex = ['index_theme_1', 'collection', 'bestforyou', 'mine'];
}

} else {

if ($config['plugin']['PG_SHOPPING_CART']) {
$tabIndex = ['index', 'cart', 'mine'];
} else {
$tabIndex = ['index', 'mine'];
}

}

$tablist = array_map(function ($tabName) use ($tabMap) { return $tabMap[$tabName];}, $tabIndex);
XPo
    283
XPo  
   2020-09-28 11:03:21 +08:00
写代码不写注释的都给爷死
soulmt
    284
soulmt  
   2020-09-28 11:20:47 +08:00
@a719031256 后端能实现就好了,如果楼主的代码是后端 写的,我二话不说,要是前端写的,就呵呵了, 当然我有个后端朋友,前端写的也很溜,仁者见仁吧。
a719031256
    285
a719031256  
   2020-09-28 11:54:28 +08:00
@soulmt 后台管理系统,最开始就推荐公司使用分离式框架,这样很多炫酷的效果都能实现而且很有效率,公司非要用原来那套古董框架,原因就是公司花钱买的,据说这套框架本来是免费的,后来不知道为毛公司又花钱买了,这套框架前端页面模板是 beetl 的,反正我个人觉得没 thymeleaf 好用,结果客户想要的效果 beetl 没法实现,只能手动写 js 来实现,写得我是吐血,据后来接盘的开发说那页面他也是有问题就在上面改一改能用就行,从不去优化它
a719031256
    286
a719031256  
   2020-09-28 11:58:38 +08:00
@soulmt 有很多时候公司根本不可能给你大把的时间去优化代码结构,我估计除了在大学里老师可能会要求学生把代码写得很高效很优雅,在公司里很少,但不是说没有
a719031256
    287
a719031256  
   2020-09-28 12:13:41 +08:00
@soulmt 不是说代码规范不重要,只是说在实际开发情况下你没法写出规范中的代码,实际开发中如果遇到需求变更这种意外情况,那你大脑中会被如何快速实现这个想法占满,而不是我如何优雅的实现
reus
    288
reus  
   2020-09-28 12:16:56 +08:00 via Android
@594duck 屎山老蛆
aguesuka
    289
aguesuka  
   2020-09-28 13:00:49 +08:00 via Android
@prime2015 可读性越高的代码越优雅
firefox12
    290
firefox12  
   2020-09-28 13:49:41 +08:00   ❤️ 1
因为一开始的项目很简单,直接上抽象,那就是过度设计。但是业务发展很快,几下子就很混乱了。需要重构。但是那时候重构意味着,没有产出。老板只看到代码没出来,你把 100 行代码改成了 2 个 20 行的函数,什么也没做。对面的小子又完成了 1000 行输入,3 个功能。你的 KPI 不行啊。

所以。最终结局就是 往屎山上拉屎,然后捏着鼻子吃屎。 这种事见得多了,直到实在没地方拉了,再重构一下。毕竟写完就扔的项目太多了。
soulmt
    291
soulmt  
   2020-09-28 14:01:24 +08:00
@a719031256 都说时间来不及,项目赶的紧,我不信他们手上的项目个个都是今天开发第二天上线,要是这样,还能呆的下去的,也是神人,行动上的勤快掩盖思想上的懒惰而已,说白了对自己没要求。
a719031256
    292
a719031256  
   2020-09-28 15:19:09 +08:00
@soulmt 公司拿一个项目 70w,两个月上线,你来试试,另外给你说一下,项目经理说客户那边还不知道想要什么效果,先做出一部分,让客户看看再定,目前的进度是,我写报表接口,从另一个子系统中拿数据,对方给的表缺字段备注,表注释重复,字段名各种拼音,首字母简写,艾特对方负责人还不回话,我在想今天能写几个接口
MessyInk
    293
MessyInk  
   2020-09-28 16:04:02 +08:00
@jackrelative 维护旧项目,看懂别人代码真的痛苦,所以就都觉得自己得最好,最容易懂,哈哈哈,就爱推翻重来==
syozzz
    294
syozzz  
   2020-09-28 17:59:38 +08:00
xhxhx
    295
xhxhx  
   2020-09-28 18:15:06 +08:00
认为这段代码没有问题的人可能已经没有了对编写代码的追求,请注意重点是"没有对代码编写的追求",不要回复我没有追求的原因
xhxhx
    296
xhxhx  
   2020-09-28 18:18:10 +08:00
楼主已经提供了 git 提交记录,证明这段代码是一次性提交。
这要用脑子稍微思考一下,都不会写出这样垃圾的代码。
写一块逻辑时,连最简单的思考都没有,只会产出垃圾,被公开处刑有问题嘛?
KuroNekoFan
    297
KuroNekoFan  
   2020-09-29 07:51:06 +08:00 via iPhone
又看了一下,觉得这段代码的问题主要在于 config 应该作为函数参数而不是一个不知道哪里来的变量,另外具体的 tab 配置可以从配置文件读取。当然这一点,算是 dirtywork,写代码里 dirty,配置文件也 dirty
毕竟原本逻辑就那么简单,想炫技都没余地
MrYELiex
    298
MrYELiex  
   2020-09-29 16:01:21 +08:00
不觉得有什么问题 唯一能做的也就是提成 json 或者 yaml 维护了 本质没什么区别 为什么一定要抽成变量 这样结构清晰 逻辑明了
1  2  3  
关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3464 人在线   最高记录 6543   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 1172ms · UTC 11:13 · PVG 19:13 · LAX 04:13 · JFK 07:13
Developed with CodeLauncher
♥ Do have faith in what you're doing.