Java 反主流文化 - 文化爪哇主义

什么是文化贾维斯主义?

你没听说过文化爪哇主义吗?太可怕了!😱

对于那些不知道的人来说,下面让我们来体验一下。

您知道当我们所有的同龄人都在写这样的课时,您​​却不敢问“为什么?”:

**警告:**

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 ValidatorFactor).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;
  }
}

当你可以拥有这个时:

public record Address (
  String street,
  String number,
  String zipCode,
  String city,
  String state,
  String country,
) {
  public Address {
    new Validator().validate();
  }
}

或者,如果您没有记录,并且不介意/想要可变性,则可以这样做:

public class SimlpleAddress {
  public String street;
  public String number;
  public String zipCode;
  public String city;
  public String state;
  public String country;

  public SimlpleAddress(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 应用程序呢?

Image Java app with many many directories

当您可以为后台系统的 25 位用户提供类似这样的小应用程序时:

Image Java app with very few directories

但文化爪哇主义到底是什么?!

我们要做什么?

这种文化就像您公司的遗留代码库,只有来自 Java 的杰出富国银行工程师。

这是一种源自于一切都是草山的时代的文化;一切都更加复杂,包括爪哇。

Image Windows XP default grass hill wallpaper

但是,我们不要恩将仇报,对吧?在某个时候,在某个地方,一切都是有用的;没有简单的工具来解决今天微不足道的问题。正如一位杰出的朋友所说,

“如今的后端工程已经有很多石头被打破了。”

遗憾的是,许多小公司认为他们需要建立一个高度可扩展、解耦的环境,具有干净的结构、端口和适配器、超现代、 500 个抽象和复杂性。为什么?

以避免留下存在技术债务的遗留系统。

因此我要说的是,系统何时会成为遗产?:

您部署它的确切时刻。

正如我杰出的妻子所说,

“当你使用 git push 时,你的代码就已经成为遗留代码了。”

如何对抗遗留问题

请注意,遗留债务和技术债务是不同的东西;由于老板要求,未经测试就发送给生产的代码会很快产生技术债务,而遗留债务只是该公司历史中的东西。

但我相信,实现 **LEAGACY OBLITERATION!** 的一个好方法是尽快交付你的代码,使其尽可能简单,当然,还要经过测试,你这个混蛋!

毕竟,如果它不能满足您的要求,您就不会花费一天中的 2 个小时来从公司的干净架构模板中删除示例文件。如果出现问题,您的流程不会被抽象为 20 个层并分布在 3 个超类和 5 个接口上,因此更改它将很简单,因为您已经简化了系统。

没错,伙计;你不需要为你的 spring-boot 应用上的每项服务都设置一个接口。你不会更改你的数据库。

Image Pointing Akon meme saying

而且,在您必须更改数据库的极少数情况下,这些抽象能给您多大帮助呢?

将您的方法单独放在另一个文件中是否能解决问题?

此时,您可能会想,“”。

是的,你不会的!

重点是,您的 ERP 系统为 5 家公司(每家有 25 名员工)提供服务,无需担心拥有像 Netflix 这样的多云系统。

您的 cron-job 运行时间为 5 秒,每天执行 3 次,不需要 3 层端口和适配器。

回到正题:文化贾维斯主义。

我们讨论了 getter 和 setter、清洁架构、端口和适配器……有关多云和带有 cron-job 的 ERP 的一些内容。这一切的意义何在?

简单来说:

人们认为 Java 冗长、缓慢、陈旧,因为市场上大多数 Java 项目都充斥着 Javistc 文化。

但不要担心,这里有解决您所有问题的答案:

Image Take on water tank meme image

Java,尤其是现代 Java,可以非常简单和简洁。

顺便说一句,2018 年之后,Java 的现代化速度比以往任何时候都快,每年推出 2 个版本,每隔一年推出 1 个 LTS 版本。

为了证明这一点,下面是一个服务示例,该服务仅使用 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 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");

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;

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 验证的密钥,另一个用于逻辑部分,在这里和那里撒上一些小接口,就可以开始了!

你真的需要一个干净的拱形模板来管理一切吗?

采取方式

对于那些认同**Javistc Counter Culture**的**叛逆**本质的人来说,就是这样;你已经明白了:加入一家初创公司。👍

对于那些不同意的人,如果你非常热爱干净的结构和干净的代码,我想为你提出一些建议:

仅使用最新 Java 提供的功能,制作一个工作内容的简单版本。这并不难。

之后的下一步是:

重构 Java 本机 API 不“符合人体工程学”的部分,放入松散的 Spring 包或 maven 存储库和 JitPack 中您认为很酷的任何库。

此时,你可能已经被**反主流文化**洗脑了,因此,摆脱 90 年代企业集团生活方式的真正自由的最后一步是:

Image Badass motorcycle dude riding its bike looking sideways

当你需要为任何事情编写一个小脚本时,该脚本用于解析日志、抓取数据,甚至是 CLI,简而言之,任何使用解释语言(如 JS 或 Python 等)进行的简单操作,尝试研究它并与你的朋友,小 Java 语言🥹一起做,你会发现它没有那么复杂,在某些情况下它甚至可能比使用那个解释语言更容易。

最后,对于那些没明白我的意思的人,可以通过 Xwitter、BlueSky、Github、Linkedin、Smoke Signal 或任何你想要的地方给我打电话。让我们交换一下想法吧。<3

太感谢了!

继续阅读相关主题:

Computaria:你被告知的关于 OOP 的谎言