V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
letitbesqzr
V2EX  ›  程序员

说说你们在项目中遇到过的最糟糕的代码

  •  
  •   letitbesqzr · 2015-08-18 18:01:11 +08:00 · 6124 次点击
    这是一个创建于 3419 天前的主题,其中的信息可能已经有所发展或是发生改变。
    最新接手的一个模块....一看代码,哭了
    68 条回复    2015-08-20 12:22:09 +08:00
    blacklee
        1
    blacklee  
       2015-08-18 18:08:23 +08:00   ❤️ 1
    公司外包项目后回来的代码

    服务端程序语言对方选择的是 Java
    MySQL 里的 bool 字段, 1 表示 false , 0 表示 true

    iOS 里面
    各种 addSubview: 在 viewWillAppear: 里面调用
    saber000
        2
    saber000  
       2015-08-18 18:09:28 +08:00   ❤️ 2
    好像很好改的样子,不就是用生命来构造构造 json 数据的代码嘛?
    xmoon
        3
    xmoon  
       2015-08-18 18:09:32 +08:00
    留名 看看如何搞死后来人
    lucky2touch
        4
    lucky2touch  
       2015-08-18 18:10:40 +08:00
    StringBuffer 不简称为 sb 不砖业啊
    Troevil
        5
    Troevil  
       2015-08-18 18:11:31 +08:00
    @saber000 用生命在构造 json 。。。 233333
    pubby
        6
    pubby  
       2015-08-18 18:18:00 +08:00
    一看就是不知 json 为何物,现场弄了个专用轮子,看上去思路挺流畅嘛 哈哈。不过万一各种.getName () 里面包含个 " 啥的 ......
    flowfire
        7
    flowfire  
       2015-08-18 18:34:06 +08:00
    整页整页全是 onclick onclick onclick onclick onclick
    。。。。。 addEventListener 真的很难么。。。
    KentY
        8
    KentY  
       2015-08-18 19:18:31 +08:00   ❤️ 3
    我贴一个吧, 以前做的项目里的。代码是多年前其它公司人写的。
    这个 method 被调用成千上万次, 在一次 debug 的时候, 我进到这个 method 里, 看到了如此简洁的实现和对于这个实现的详细思路和注解。 当时敬佩地脱口而出: what the fuck!

    不知道图能不能显示。 一直保留这个截屏, 只把开发者名字模糊了:

    ljbha007
        9
    ljbha007  
       2015-08-18 19:40:35 +08:00   ❤️ 1
    @KentY
    重构的时候搞坏了吧

    跟你们说说什么叫“刷新世界观”
    我见过最经典的代码:一个 Android 的应用里有数量不定的由复杂的子视图构成的列表
    子视图里好像有需要滚动的部件 当时是 android2.2 这个问题比较头疼
    该程序员因为上述原因加上“数量不定” 把同样的视图在布局文件里复制了 60 多遍 并全部隐藏
    然后把给视图控件赋值并取消隐藏的代码( 20 多行)也复制了 60 多遍 然后用 if else 连接起来
    并且把变量名后的数字 每复制一次则递增 1 (注意:是变量名的后缀数字!不是变量的值)
    如果列表元素数量大于 60 则直接不管了

    整个方法长度大概 1400 来行
    看完我终于明白为什么有的程序员老要加班了!

    代码结构大概是这个样子:

    ```
    public void updateList (List itemList ){
    Item item0;
    Item item1;
    item0 = itemList.get (0 );
    if (item0 != null ){
    viewA1.setText (item0.getX ());
    viewA2.setText (item0.getX ());
    viewA3.setText (item0.getX ());
    ...
    item1 = itemList.get (1 );
    }else if (item1!= null ){
    viewB1.setText (item1.getX ());
    viewB2.setText (item1.getX ());
    viewB3.setText (item1.getX ());
    ...
    item2 = itemList.get (2 );
    }
    // 此处省略 1400 行
    }
    ```
    hellogbk
        10
    hellogbk  
       2015-08-18 20:20:23 +08:00
    其实我也一直是这么拼 JSON 的, 请问有什么现成的 API 或者库可以快速拼出来想要的 JSON 吗?
    axb
        11
    axb  
       2015-08-18 20:23:51 +08:00
    前一阵写了一篇文章:
    http://blog.2baxb.me/archives/1343
    KentY
        12
    KentY  
       2015-08-18 20:25:43 +08:00
    msg7086
        13
    msg7086  
       2015-08-18 20:27:46 +08:00
    目测这贴要火
    holy_sin
        14
    holy_sin  
       2015-08-18 20:28:11 +08:00
    写的犹豫不决的代码是最糟糕的,往往留下很多糟糕的注释。我的建议是既然现在的代码管理工具,那些觉得没用而注释的代码可以一律删掉。还有一点就是 api 写的不清晰。给使用者造成了很大的混淆,浪费了时间成本。
    kisshere
        15
    kisshere  
       2015-08-18 20:31:54 +08:00
    if ($isLogin==true ){}
    <a></table></a>
    holy_sin
        16
    holy_sin  
       2015-08-18 20:32:31 +08:00
    还有过早优化也是问题的根源之一。不要过多的考虑未来的需求,导致代码的层次很深,最后还要跑回来删掉无用的封装逻辑。
    还有一点,就是产品忙于上线,会配置很多脏数据,上线之后,再清理脏数据。这样的节奏给客户端和服务端造成了 1 + (-1 ) < 0 的效果。尽量避免脏数据。
    hcymk2
        17
    hcymk2  
       2015-08-18 21:04:15 +08:00
    @KentY
    龟孙很垃圾的 请不要推荐这个。
    Troevil
        18
    Troevil  
       2015-08-18 21:12:36 +08:00
    @hellogbk 拼可以 好歹写个递归吧。。。
    KentY
        19
    KentY  
       2015-08-18 21:16:25 +08:00
    @hcymk2 干嘛骂人呢?
    warlock
        20
    warlock  
       2015-08-18 21:42:35 +08:00 via Android
    applet 调用 POS 机打印小票...根本没法调试...
    hcymk2
        21
    hcymk2  
       2015-08-18 21:58:18 +08:00
    @KentY
    不是骂人 。。。。 g (鬼)son (孙)。。。
    这玩意太慢了 。
    hcymk2
        22
    hcymk2  
       2015-08-18 21:59:37 +08:00
    g (龟)son (孙)
    hellogbk
        23
    hellogbk  
       2015-08-18 22:00:33 +08:00
    @Troevil 啊, 我一开始没仔细看楼主发的代码,以为只是在单纯地拼 JSON ,没感觉这样做有什么大问题。刚看了一下, 原来那家伙写成那个样子了。
    hellogbk
        24
    hellogbk  
       2015-08-18 22:03:05 +08:00
    @KentY 没太仔细看这个文档,假如一个类里面有很多成员,根据不同的场景,需要将不同的成员组成在一起拼成 JSON ,这种情况那个东西能做吗?
    KentY
        25
    KentY  
       2015-08-18 22:15:13 +08:00
    @hcymk2 原来如此, 话说咱们都这么起名的啊? 我第一次听到说 winxp 是温叉屁 时候笑了半天。
    @hellogbk 我平时没用 java 的 json 的库, 随便一搜。 你这个情况 json 里面不用的空着不就得了。 json 都是程序用,又不给用户看。
    publicID001
        26
    publicID001  
       2015-08-18 22:43:21 +08:00 via Android
    开头一本正经的写了个 RSA implementation
    然而实现却是一个 xor 还不是 sbox
    phx13ye
        27
    phx13ye  
       2015-08-18 23:29:20 +08:00
    @hcymk2 又快又安全的是?
    LioMore
        28
    LioMore  
       2015-08-18 23:37:16 +08:00
    真特么操蛋

    .one,
    .two,
    .three,
    .four,
    .five,
    .six {
    float: left;
    width: 100px;
    height: 40px;
    line-height: 40px;
    }
    .one a,
    .two a,
    .three a,
    .four a,
    .five a,
    .six a {
    display: block;
    text-decoration: none;
    color: #fff;
    }
    .one a:hover,
    .two a:hover,
    .three a:hover,
    .four a:hover,
    .five a:hover,
    .six a:hover {
    color: white;
    background-color: #ff7d03;
    }
    xbb7766
        29
    xbb7766  
       2015-08-19 01:01:10 +08:00 via Android
    字符串查找取年月日的值。
    丫开发的环境是中文系统,服务器是英文系统,上服务器测试运行时候就在这地方崩了。。。
    Laforet
        30
    Laforet  
       2015-08-19 05:46:38 +08:00
    @xbb7766 Windows 下面写运维脚本经常遇到这个问题。最后是用了一个外部命令获取 UNIX 时间然后再转换。
    ZnZt
        31
    ZnZt  
       2015-08-19 08:40:24 +08:00
    @kisshere

    data.login == "true"
    moe3000
        32
    moe3000  
       2015-08-19 08:40:53 +08:00
    有些复杂的对象我也这么转 json 233
    RagingSweet
        33
    RagingSweet  
       2015-08-19 08:44:33 +08:00
    你们这些代码和某四大银行核心系统的溢出判断代码相比都写的太好啦
    gongpeione
        34
    gongpeione  
       2015-08-19 09:21:07 +08:00   ❤️ 1
    看过一段这样的代码



    看到上面的回复又感觉这个还好的样子了 2333
    thinkmore
        35
    thinkmore  
       2015-08-19 09:49:05 +08:00
    @letitbesqzr 他知道用 StringBuffer 已经很好了
    geeksu
        36
    geeksu  
       2015-08-19 09:51:33 +08:00
    ]
    ]
    ]
    ]
    ]
    ]
    ]
    ]
    ]
    return 0;]
    fwrq41251
        37
    fwrq41251  
       2015-08-19 10:05:26 +08:00
    这帖子真的不是在黑 java?
    w88975
        38
    w88975  
       2015-08-19 11:14:41 +08:00
    这是 java 还是 C# 看了半天楞是没看出来
    fenjuly
        39
    fenjuly  
       2015-08-19 12:45:48 +08:00
    @KentY 哈哈,我笑喷啦。
    julyclyde
        40
    julyclyde  
       2015-08-19 13:02:31 +08:00
    twoChild 是啥?
    miemiekurisu
        41
    miemiekurisu  
       2015-08-19 13:30:32 +08:00 via Android
    400 行满是深度嵌套的 if else ( 20 层),考验你的视力
    yxzblue
        42
    yxzblue  
       2015-08-19 13:49:55 +08:00
    xiaowangge
        43
    xiaowangge  
       2015-08-19 14:07:15 +08:00   ❤️ 1
    性别字段为 : sex , int 类型,并且 0 表示男, 1 表示女 :-)
    update
        44
    update  
       2015-08-19 14:18:19 +08:00
    @gongpeione
    这个 function zhuru (zhi ) 真是萌萌的。。
    update
        45
    update  
       2015-08-19 14:18:31 +08:00
    @gongpeione
    这个 function zhuru (zhi ) 真是萌萌的。。
    😊
    pedestrianc
        46
    pedestrianc  
       2015-08-19 14:25:29 +08:00
    - (void )setAudiecenModel:(QIAudienceViewCellModel *)audiecenModel {
    _audiecenModel = audiecenModel;

    CGFloat restrictionWidth = kDeviceWidth - self.groupNameLabel.frame.origin.x - MARGIINOFCONTROLS - 20;
    NSDictionary* groupLevel = audiecenModel.groupLevelDict[audiecenModel.userID];
    NSString* fansID = groupLevel[@"fansID"];
    NSString* rankName = groupLevel[@"level"];
    if (nil != rankName ) {
    audiecenModel.rankName = rankName;
    } else {
    rankName = audiecenModel.rankName;
    }

    NSString* rankImageName = [NSString stringWithFormat:@"group_level%ld",audiecenModel.rankName.integerValue];
    if (nil == rankName ) {
    rankImageName = nil;
    }
    if ([_audiecenModel.anchorRank integerValue] > 0 ) {
    rankImageName = [NSString stringWithFormat:@"live_anchor_nobility%@",_audiecenModel.anchorRank];
    }
    if (nil == rankName && [_audiecenModel.anchorRank integerValue] <= 0 ) {
    rankImageName = nil;
    }

    self.rankImageView.image = [UIImage imageNamed:rankImageName];
    if (nil == audiecenModel.rankName || [audiecenModel.rankName isEqualToString:@""]) {
    self.rankImageViewWidthCons.constant = 11;
    self.groupNameLabelLeadingCons.constant = 12;
    } else {
    self.rankImageViewWidthCons.constant = 11;
    self.groupNameLabelLeadingCons.constant = 12;
    }

    NSString* fansGroupName = audiecenModel.groupNameDict[fansID][@"fansName"];
    if (nil == rankName ) {
    fansGroupName = nil;
    }
    if (nil != fansGroupName ) {
    audiecenModel.fansGroupName = fansGroupName;
    } else {
    fansGroupName = audiecenModel.fansGroupName;
    }

    CGSize groupNameSize = [fansGroupName sizeWithFont:[UIFont systemFontOfSize:COMMONFONTSIZE]];
    if (nil == audiecenModel.fansGroupName || [audiecenModel.fansGroupName isEqualToString:@""]) {
    self.userNameLeadingCons.constant = 0;
    } else {
    self.userNameLeadingCons.constant = MARGIINOFCONTROLS;
    }
    self.groupNameLabel.text = fansGroupName;
    NSString* userName = audiecenModel.userName;
    if ([audiecenModel.userID isEqualToString:[UserManager shareUserManager].userItem.userID]) {
    NSString *name = [UserManager shareUserManager].userItemDic[@"nickname"];
    self.userNameLabel.text = name?name:self.userNameLabel.text;

    }

    CGSize size = [userName sizeWithFont:[UIFont systemFontOfSize:COMMONFONTSIZE]]; // wwc 过时的方法
    self.userNameLabel.text = userName;


    NSDictionary* medalInfor = _audiecenModel.medalDict[_audiecenModel.userID];
    NSString* medalImageName = nil;
    if ([medalInfor isKindOfClass:[NSString class]]) {
    medalImageName = (NSString*)medalInfor;
    } else {
    medalImageName = medalInfor[@"image"];
    }

    [self.medalImageView sd_setImageWithURL:[NSURL URLWithString:medalImageName] placeholderImage:nil];
    if (nil == medalImageName || [medalImageName isEqualToString:@""]) {
    self.medalLeadingCons.constant = 0;
    self.medalWidthCons.constant = 0;
    } else {
    self.medalLeadingCons.constant = MARGIINOFCONTROLS;
    self.medalWidthCons.constant = 18;
    }

    self.vestImageView.image = [UIImage imageNamed:audiecenModel.vestName];
    self.nobilityImageView.image = [UIImage imageNamed:audiecenModel.nobilityName];
    if (![@"noble100" isEqualToString:audiecenModel.nobilityName]) {
    self.nobilityImageView.hidden = NO;
    self.eventBgView.hidden = NO;
    _tap.enabled = YES;
    } else {
    _tap.enabled = NO;
    }

    if (restrictionWidth > 150 && [audiecenModel.userID isEqualToString:@"20066"]) {
    GGLogDebug (@"=======restrictionWidth======%f",restrictionWidth );
    }

    if (medalImageName ) {
    restrictionWidth -= (self.medalWidthCons.constant + MARGIINOFCONTROLS );
    }
    if (self.vestImageView.image ) {
    restrictionWidth -= (self.vestImageView.frame.size.width + MARGIINOFCONTROLS );
    }
    if (self.nobilityImageView.image ) {
    restrictionWidth -= (self.nobilityImageView.frame.size.width + MARGIINOFCONTROLS );
    }
    if (restrictionWidth < groupNameSize.width + size.width ) {
    self.groupNameWidthCons.constant = groupNameSize.width > restrictionWidth * LABELWIDTHRADIO ? restrictionWidth* LABELWIDTHRADIO : groupNameSize.width;
    self.userNameLabelWidthCons.constant = restrictionWidth - self.groupNameWidthCons.constant;
    } else {
    self.groupNameWidthCons.constant = groupNameSize.width;
    self.userNameLabelWidthCons.constant = size.width;
    }

    if ([audiecenModel.userID isEqualToString:@"20066"]) {
    GGLogDebug (@"=======restrictionWidth======%f",restrictionWidth );
    }
    }








    一个赋值方法一百多行,不建 model 数据混乱。赋值之后各种计算 layout 。。。。。同事的代码。
    letitbesqzr
        47
    letitbesqzr  
    OP
       2015-08-19 14:36:19 +08:00
    @xiaowangge 哈哈 以前遇到过... 身份信息..本来只有两个 1 代表医生 0 代表居民 。。。在程序里用 true 和 false ... 后来说要加一个 管理员身份,就傻逼了。
    zacard
        48
    zacard  
       2015-08-19 14:47:09 +08:00
    糟糕代码不报错,你就谢天谢地吧。遇到不测试(甚至有编译时错误)就直接提交代码的,你哭都来不及。。。
    andybest
        49
    andybest  
       2015-08-19 15:20:20 +08:00
    @blacklee "服务端程序语言对方选择的是 Java
    MySQL 里的 bool 字段, 1 表示 false , 0 表示 true "

    那 bool 应如何在 MySQL 中储存?
    aivier
        50
    aivier  
       2015-08-19 15:21:52 +08:00
    JS 里用 JSON , C#配合 PHP 服务器端一直用 XML ,这写法也是够惊人的....
    mozartgho
        51
    mozartgho  
       2015-08-19 15:42:46 +08:00
    楼主,体现你 performance 的时候到了!
    iugo
        52
    iugo  
       2015-08-19 15:44:19 +08:00   ❤️ 1
    @andybest 简单来说, 你不觉得有点写反了吗?
    laucie
        53
    laucie  
       2015-08-19 15:52:06 +08:00
    百度单词 来全拼
    akira
        54
    akira  
       2015-08-19 15:58:48 +08:00
    for a:=1 to a1 do
    for b:=1 to b1 do
    for c:=1 to c1 do
    for d:=1 to d1 do
    for e:=1 to e1 do
    for f:=1 to f1 do
    for g:=1 to g1 do
    for h:=1 to h1 do
    for i:=1 to i1 do
    for j:=1 to j1 do
    for k:=1 to k1 do
    for l:=1 to l1 do
    for m:=1 to m1 do
    for n:=1 to n1 do
    for o:=1 to o1 do
    for p:=1 to p1 do
    for q:=1 to q1 do
    for r:=1 to r1 do
    for s:=1 to s1 do
    for t:=1 to t1 do

    我们问他,万一字母不够用怎么办
    scarlex
        55
    scarlex  
       2015-08-19 16:44:58 +08:00
    @xiaowangge ...我觉得应该反过来才对啊, 0 表示女, 1 表示男...
    xuewl
        56
    xuewl  
       2015-08-19 16:45:58 +08:00
    @blacklee MYSQL 的布尔值使用 tinyint (1 ) 的 1 和 0 来表示难道不是科学的方法吗?
    reinhardzoe
        57
    reinhardzoe  
       2015-08-19 16:52:50 +08:00
    坐等 "我就是那个 1 表示 girl,0 表示 boy 的程序员"
    xiaowangge
        58
    xiaowangge  
       2015-08-19 17:25:20 +08:00
    @scarlex 是啊。「常识」,大家都认为 0 表示女, 1 表示男。

    但代码中,就是相反的啊。害我还出了个 bug 呢 :-)
    jjed0119cs04
        59
    jjed0119cs04  
       2015-08-19 17:28:44 +08:00
    我擦。这么多人。。。
    siteshen
        60
    siteshen  
       2015-08-19 17:40:58 +08:00
    #!/usr/bin/env python

    # example 1
    def get_something (self, a, b, get_c=True ):
    if get_c:
    c = a + b
    return a, b, c
    else
    return a, b

    # example 2
    def list_users_handler (self, request ):
    user_ids = exec (request.params['user_ids'])
    wupher
        61
    wupher  
       2015-08-19 17:42:36 +08:00
    下午刚看到,真是气死我了,这已经不是第一回了。

    ![Imgur]( )
    369830973
        62
    369830973  
       2015-08-19 17:51:15 +08:00
    楼主 GGE 的煞笔
    glasslion
        63
    glasslion  
       2015-08-19 18:07:43 +08:00
    @xiaowangge 哈哈, 我见过用 1 , 2 代表性别的, 然后表里还有值为 3 , 4 的数据
    wangccddaa
        64
    wangccddaa  
       2015-08-19 18:11:19 +08:00
    @wupher 好大一个坑啊,这个出个规范+代码 review 应该可以避免
    hitsmaxft
        65
    hitsmaxft  
       2015-08-19 18:46:36 +08:00 via iPhone
    用 velocity 拼接 json
    pein
        66
    pein  
       2015-08-20 10:02:13 +08:00
    @andybest
    @xuewl
    两位都是用 1 表示 false , 0 表示 true 的吗?
    582033
        67
    582033  
       2015-08-20 10:38:12 +08:00
    我没法粘贴,一个 function 3000 行!!!!

    3000 行啊!!!

    if 又 if 让我怎么看!!!
    cdxem713
        68
    cdxem713  
       2015-08-20 12:22:09 +08:00
    @andybest mysql 本来就没有 bool,一般都是用 tinyint (1 )
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2583 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 15:02 · PVG 23:02 · LAX 07:02 · JFK 10:02
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.