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

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

但文化爪哇主义到底是什么?!
我们要做什么?
这种文化就像您公司的遗留代码库,只有来自 Java 的杰出富国银行工程师。
这是一种源自于一切都是草山的时代的文化;一切都更加复杂,包括爪哇。

但是,我们不要恩将仇报,对吧?在某个时候,在某个地方,一切都是有用的;没有简单的工具来解决今天微不足道的问题。正如一位杰出的朋友所说,
“如今的后端工程已经有很多石头被打破了。”
遗憾的是,许多小公司认为他们需要建立一个高度可扩展、解耦的环境,具有干净的结构、端口和适配器、超现代、 500 个抽象和复杂性。为什么?
以避免留下存在技术债务的遗留系统。
因此我要说的是,系统何时会成为遗产?:
您部署它的确切时刻。
正如我杰出的妻子所说,
“当你使用 git push 时,你的代码就已经成为遗留代码了。”
如何对抗遗留问题
请注意,遗留债务和技术债务是不同的东西;由于老板要求,未经测试就发送给生产的代码会很快产生技术债务,而遗留债务只是该公司历史中的东西。
但我相信,实现 **LEAGACY OBLITERATION!** 的一个好方法是尽快交付你的代码,使其尽可能简单,当然,还要经过测试,你这个混蛋!
毕竟,如果它不能满足您的要求,您就不会花费一天中的 2 个小时来从公司的干净架构模板中删除示例文件。如果出现问题,您的流程不会被抽象为 20 个层并分布在 3 个超类和 5 个接口上,因此更改它将很简单,因为您已经简化了系统。
没错,伙计;你不需要为你的 spring-boot 应用上的每项服务都设置一个接口。你不会更改你的数据库。

而且,在您必须更改数据库的极少数情况下,这些抽象能给您多大帮助呢?
将您的方法单独放在另一个文件中是否能解决问题?
此时,您可能会想,“”。
是的,你不会的!
重点是,您的 ERP 系统为 5 家公司(每家有 25 名员工)提供服务,无需担心拥有像 Netflix 这样的多云系统。
您的 cron-job 运行时间为 5 秒,每天执行 3 次,不需要 3 层端口和适配器。
回到正题:文化贾维斯主义。
我们讨论了 getter 和 setter、清洁架构、端口和适配器……有关多云和带有 cron-job 的 ERP 的一些内容。这一切的意义何在?
简单来说:
人们认为 Java 冗长、缓慢、陈旧,因为市场上大多数 Java 项目都充斥着 Javistc 文化。
但不要担心,这里有解决您所有问题的答案:

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 年代企业集团生活方式的真正自由的最后一步是:

当你需要为任何事情编写一个小脚本时,该脚本用于解析日志、抓取数据,甚至是 CLI,简而言之,任何使用解释语言(如 JS 或 Python 等)进行的简单操作,尝试研究它并与你的朋友,小 Java 语言🥹一起做,你会发现它没有那么复杂,在某些情况下它甚至可能比使用那个解释语言更容易。
最后,对于那些没明白我的意思的人,可以通过 Xwitter、BlueSky、Github、Linkedin、Smoke Signal 或任何你想要的地方给我打电话。让我们交换一下想法吧。<3
太感谢了!
继续阅读相关主题:
Computaria:你被告知的关于 OOP 的谎言