code review 把国外的同事气到吐血

13 小时 38 分钟前
 midsolo

国外的同事来国内出差,趁着这个机会,邀请他跟我们一起进行 code review......

公司的代码没办法拿出来,只能临时写个伪代码让大家鉴赏一下:

/**
 * 代码鉴赏:执行 1 个任务
 */
public class JavaTasteSample {

    public static void main(String[] args) {

        // 国外同事:1 行代码就搞定,简洁明了
        // ==(浪费了大量的时间在做过度设计,毫无意义的炫技)==
        new Thread(() -> System.out.println("task1 running...")).start();

        // 国内同事:高内聚低耦合,把具体要执行的任务跟线程进行分离,方便扩展......
        // ==(这老外太 low 了,连设计模式都不懂,估计不会写代码)==
        new Thread(new Task(new TaskInnerSupport())).start();
    }

}

interface TaskInner {

    void execute();

}

abstract class AbstractTaskInner implements TaskInner {

    @Override
    public void execute() {
        runTask();
    }

    abstract void runTask();

}

class TaskInnerSupport extends AbstractTaskInner {

    @Override
    public void runTask() {
        System.out.println("task2 running...");
    }
    
}

class Task implements Runnable {

    private TaskInner inner;

    public Task(TaskInner taskInner) {
        inner = taskInner;
    }

    @Override
    public void run() {
        inner.execute();
    }

}
8042 次点击
所在节点    程序员
84 条回复
midsolo
13 小时 18 分钟前
@askfilm 没有双标,这段代码是同事写的,他也是前 dubbo contributor ,平时写代码喜欢炫技
darksword21
13 小时 17 分钟前
这种我统称为被 java 污染了脑子(
qping
13 小时 16 分钟前
封了好几层每一层职责是什么?现在看起来什么事也没做,就是大肠包小肠
chenluo0429
13 小时 15 分钟前
绝大部分自以为是的扩展,最后根本用不上。其中大概一半多增加了不必要的复杂度,对相关开发造成困扰。一小部分会对后续的基于真实需求的扩展造成非常大的阻碍
WithoutSugarMiao
13 小时 15 分钟前
javaer 写代码考虑的真多。换成 python 的话,就没有这种烦恼,绝大部分 Pythonista 估计都会用第一种直来直去的写法。
songco
13 小时 15 分钟前
支持第一种

以前设计模式流行的时候,公司有的代码特别恐怖,所有的地方都支持扩展,但是 99%其实就一种实现
otakustay
13 小时 14 分钟前
现在有 Coding Agent 了,这种场景就算未来发现有扩展了改一套设计,找个 Agent ,明显有特征的代码( new Thread )全部扫一遍重构成新的方案,不要太简单
i8086
13 小时 11 分钟前
业务变化无法预知,不要过早优化,也不要过度设计。

这段伪代码,对应业务是什么?没对应业务,那肯定越简单越好。
zh6335901
13 小时 11 分钟前
抽象一般是你发现或者预见到了需要抽象的东西才去做,而不是自己去制造抽象
midsolo
13 小时 7 分钟前
@winglight2016 哈哈,团队里好几个前 dubbo contributor ,很多业务代码也参照了 dubbo 的设计,使用 微内核+插件化+SPI 扩展,就是过度设计
beneo
12 小时 23 分钟前
@midsolo 得看看你们在做时间什么事情,业务代码肯定不能过度设计,但是核心模块可以
cloudzhou
12 小时 19 分钟前
这里两个写法看不出什么,如果是我的话,会将这个 Task 的逻辑,写到具体的 Service
然后 TaskRunner 作为一个中间组件

到这个程度的话:
1. new Thread(() -> XXXService.DoSomething).start(); // 原生线程池,没有特殊处理
2. TaskRunner.Run("doSomething", () -> XXXService.DoSomething); // 中间件封装

为什么中间件封装:
1. 统计,监控,日志
2. 线程数量控制(即便是协程)
3. 以后 TaskRunner 控制复杂调度(优先级,丢弃,限流...)

如果你们是一个成熟的团队,本来就需要这些中间件,在这个基础上,都只是一个简单的方法调用而已
cloudzhou
12 小时 17 分钟前
#32 上面的 1/2 区别很小,对于团队的人来说接受度没什么区别,所以你们的问题是:
复杂场景下,需要丰富中间件,而不是“按需开发中间件”,这样会增加其他团队成员的理解程度
ppooqq
11 小时 43 分钟前
说个常见的,IService/ServerImpl ,我写了多年代码也没遇上几回需要多实现的场景,我重来都是直接一个 Service
leegradyllljjjj
11 小时 23 分钟前
不好意思 我们是按代码量算钱的
spike0100
11 小时 17 分钟前
@midsolo #13 确实如此。有时候你写的扩展,对接手的人来讲只是累赘。
superrichman
11 小时 4 分钟前
啰里八唆的 JAVA 味道是这样的
BingoXuan
11 小时 4 分钟前
最好加上 pool 去调度,任务开始前,创建上下文注入 thread local 去隔离变量就够了
sankemao
11 小时 3 分钟前
平白无故添加了认知负荷,人的精力是有限的
newInterface
11 小时 0 分钟前
我还见过在 java 里写 kotlin 的

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

https://ex.noerr.eu.org/t/1170635

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

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

© 2021 V2EX