为了账号安全,请及时绑定邮箱和手机立即绑定

Java编程新风尚——告别冗余,拥抱简洁高效

标签:
Java
什么是文化雅维主义?

(注:雅维主义是指某种特定的文化现象或观念。)

你没听说过“文化雅维主义”吗?哎呀,真是太可怕了!😱

对于那些还不知道的人来说,这里给你一点感受。

你知道当所有的同行都在写这样的类时,你在这点上不敢问“为什么?”:
注意: 别浪费时间去看EnterpriseAddress类的完整代码了.

public class EnterpriseAddress {
  private String street;
  private String number;
  private String zipCode;
  private String city;
  private String state;
  private String country;

  public EnterpriseAddress(String street, String number, String zipCode, String city, String state, String country) {
    Validator validator = (new ValidatorFactory).getValidator();

    this.street = street;
    this.number = number;
    this.zipCode = zipCode;
    this.city = city;
    this.state = state;
    this.country = country;
    validator.validate();
  }

  public String getStreet() {
    return street;
  }

  public void setStreet(String street) {
    this.street = street;
  }

  public String getNumber() {
    return number;
  }

  public void setNumber(String number) {
    this.number = number;
  }

  public String getZipCode() {
    return zipCode;
  }

  public void setZipCode(String zipCode) {
    this.zipCode = zipCode;
  }

  public String getCity() {
    return city;
  }

  public void setCity(String city) {
    this.city = city;
  }

  public String getState() {
    return state;
  }

  public void setState(String state) {
    this.state = state;
  }

  public String getCountry() {
    return country;
  }

  public void setCountry(String country) {
    this.country = country;
  }
}

全屏 / 退出全屏

要是你当时能拿到这个多好:

定义了一个名为Address的公共记录类,该类包含街道、门牌号、邮政编码、城市、州/省和国家等字段。在这个类的构造函数中调用了一个Validator的实例来验证数据。

全屏模式。退出全屏。

或者像这样,如果你没有记录,并且不想让它可变:

    public class SimpleAddress {
      public String street;
      public String number;
      public String zipCode; // 邮编
      public String city;
      public String state;
      public String country;

      public SimpleAddress(String street, String number, String zipCode, String city, String state, String country) {
        this.street = street;
        this.number = number;
        this.zipCode = zipCode;
        this.city = city;
        this.state = state;
        this.country = country;

        // 创建验证器并验证数据
        new Validator().validate();
      }
    }

全屏模式 退出全屏

又有谁见过这样的Java程序?

一个Java应用,有很多目录的图片

当你有了这样一个小应用,供你后端系统的25个用户使用:

包含少量文件夹的Java应用程序图像

那么,到底文化雅维主义到底是什么??

我们要去哪儿?

这种文化就像是你公司里的遗留代码库,只不过是在Java领域,惠普的工程师们才区分出了这种文化。这是一种一切从草创时期的文化;那时一切都更复杂,包括Java语言。

图像 Windows XP 默认草地壁纸

但我们不应该恩将仇报,对吧?在过去,某些东西都是有用的;当时这些问题的解决方法并没有如今这么简单。正如一位朋友所说,

"今天的后端工程已经解决了许多难题。"

遗憾的是,许多小型公司认为他们需要建立一个非常灵活且模块化的环境,采用清晰架构和端口适配器,极其现代,包含500个抽象概念,非常复杂。为什么呢?
为了避免遗留一堆技术债务的老系统。这是为什么呢?

我的看法是,一个系统什么时候算作老系统?
就在系统被部署的那一刻。

正如我老婆常说的,

"当你 git push 时,你的代码已经算是历史遗留代码了。"

如何应对遗留问题

需要注意的是,技术债务和遗留系统是不同的;由于老板强求而未经测试就部署到生产环境的代码可能会迅速产生技术债务,而技术遗留只是该公司历史的一部分。

但我觉得,实现彻底消除你的影响!的一个好方法是尽快提交你的代码,尽可能简单,并且,当然,还要确保它经过充分测试,你这混蛋!

毕竟,如果出了问题,你也没有花两个小时只是删除公司的干净的架构模板中的示例文件(如公司模板内的)。如果出了问题,你的流程并没有抽象成20层,分散到3个超类和5个接口中,使得修改起来会变得复杂,因为你的系统本来就很简单。

没错,伙计;你的 spring-boot 应用不必为每个服务都设置接口。你也无需担心修改数据库。

图片指向Akon梗

而且,如果真的需要更换数据库(这种情况非常罕见),那些抽象在那时候能帮上多大的忙呢?
把方法放在另一个文件里,这不就能解决问题了吗?

这时候你可能在想,“但是怎么才能用简单的方法把一个系统扩展到一亿用户呢?”
没错,这可不容易!
这时候你可能在想,“但是怎么才能用简单的方法把一个系统扩展到一亿用户呢?
对,你也做不到!

你的ERP系统服务于5家各有25名员工的公司,无需担心像Netflix那样的多云系统。你的cron作业只需5秒运行,每天运行3次,也不需要这样的复杂结构,如三层端口和适配器。

咱们回到正题,聊聊文化雅维主义。

我们讨论了 getter 和 setter、整洁架构、端口和适配器……还讨论了多云和带有 cron-job 的 ERP 系统。这有什么意义呢?

简单来说:
人们认为Java繁琐、慢、过时,这是因为市场上大多数Java项目都离不开这种Java文化。

但是别担心,这里有个答案能解决你所有的问题。

把水塔搞定了
看看这个搞笑的水塔梗图吧

Java,尤其是现代Java,可以极其简单和简洁。
顺便提一下,自2018年以来,Java的发展速度比以往任何时候都要快,每年发布两个版本,每两年有一个长期支持版本。

为了说明这一点,这里有一个例子,展示如何仅用Java内置API解析符合AWS Cognito要求的日期:

你并不需要为了所有事情都使用Spring Boot:

    import com.sun.net.httpserver.HttpExchange;
    import com.sun.net.httpserver.HttpServer;

    void main() throws Exception {
      var server = HttpServer.create(new InetSocketAddress(8080), 0);
      server.createContext("/", httpExchange -> cognitoParsedDate().ifPresentOrElse(
              date -> send(httpExchange, 200, date),
              () -> send(httpExchange, 500, "")));
      server.start();
    }

    Optional<String> cognitoParsedDate() {
      try {
        TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
        var dateFormat = new SimpleDateFormat("EEE MMM dd HH:mm:ss zzzz yyyy", Locale.ENGLISH);
        return Optional.of(dateFormat.parse(new Date().toString()).toString());
      } catch (ParseException e) {
        return Optional.empty();
      }
    }

    void send(HttpExchange httpExchange, int code, String response) {
      try {
        httpExchange.sendResponseHeaders(code, response.length());
        var outputStream = httpExchange.getResponseBody();
        outputStream.write(response.getBytes());
        outputStream.close();
      } catch (Exception e) {
        throw new RuntimeException(e);
      }
    }

全屏模式 退出全屏

它的长度不到50行;它是一个单一文件,并且不需要其他任何外部依赖。

再来看看用JavaScript写的同样服务:

const http = require("http");

/**

* 获取格式化的日期和时间字符串

* @returns {string} 格式化的日期和时间字符串
 */
function getFormattedTimestamp() {
  const date = new Date();

  const dayOfWeek = date.toLocaleString('en-US', {
    weekday: 'long',
    timeZone: 'UTC',
  });
  const month = date.toLocaleString('en-US', {
    month: 'long',
    timeZone: 'UTC',
  });
  const day = date.toLocaleString('en-US', { day: 'numeric', timeZone: 'UTC' });
  const year = date.toLocaleString('en-US', {
    year: 'numeric',
    timeZone: 'UTC',
  });

  const time = date.toLocaleTimeString('en-US', {
    hour: '2-digit',
    minute: '2-digit',
    second: '2-digit',
    hour12: false,
    timeZone: 'UTC',
    timeZoneName: 'short',
  });

  const [timeOnly, timeZone] = time.split(' ');

  const parsedDate = `${dayOfWeek} ${month} ${day} ${timeOnly} ${timeZone} ${year}`;
  console.log(parsedDate);

  return parsedDate;
}

const host = 'localhost';
const port = 6666;

/**

* 请求监听器函数

* @param {http.IncomingMessage} req 请求对象

* @param {http.ServerResponse} res 响应对象

* @returns {void}
 */
const requestListener = function (req, res) {
  res.writeHead(200);
  res.end(getFormattedTimestamp());
};

const server = http.createServer(requestListener);
server.listen(port, host, () => {
  console.log(`Server is running on http://${host}:${port}`);
});

点击全屏观看,再点击退出全屏

不过,在这个示例的领域里,比如“Cognito Utils”服务,你觉得把这个服务模块化有难度吗?
"这代码没法维护啊!所有东西都在一个文件里呢!"
唉,这代码没法维护!所有东西都在一个文件里呢!

只需将其拆分一下,将端点信息写在一个文件里,按业务领域将业务逻辑分开,处理这种糟糕的Cognito日期格式的文件,还有一个处理 SRP 的文件;你可以创建一个用于生成 SRP 验证密钥的文件,另一个文件处理逻辑部分,在各处添加一些小接口,你就可以着手做了!
你真的需要为每件事都套用干净架构模板吗?

取餐方法

对于那些认同这样的叛逆Javistic反文化的人来说,就是这样说的;你懂了:去创业吧。

如果你不同意,如果你非常热爱简洁的架构和整洁的代码,我有几点建议想和你分享。

使用最新Java的功能,做一个你工作中的简单版本。这不会太难。

接下来的步骤将是:
重构那些Java原生API不够“人性化”的部分,加入松散的Spring包或其他你觉得酷的库,这些库可以从Maven仓库或JitPack获取。

到这个时候,你可能已经被 JCounter Culture 洗脑了,那么摆脱90年代的企业集团生活方式的真正自由的最后一步是:

![酷帅的摩托车手侧脸骑着车](https://imgapi.imooc.com/67637495094436c505620576.jpg)

当你需要编写一个小脚本,解析日志、抓取数据,甚至是一个简单的命令行工具,总之任何简单的事情,你可以试着用你的朋友——小巧的Java语言来完成这些任务,你会发现这并没有想象中那么复杂,甚至在某些情况下,它可能比那些解释型语言(如JS或Python)还要容易。

如果你们还是不明白的话,你们可以在我常用的平台上联系我,比如Xwitter、BlueSky、Github、Linkedin,或者包括烟信号或任何其他方式。让我们交换想法吧。<3
非常感谢大家!

继续阅读相关话题:
Computaria 的说法:关于 OOP(面向对象编程)你听说的谣言

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消