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(); } OptionalcognitoParsedDate() { 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 的谎言