Scala 中使用过它,其他语言也有
篇文章的部分灵感来
现在,这是一个不错的功能。几年前我在 Scala 中使用过它,其他语言也有,所以在 Java 中引入它似乎很容易。
但是,句法糖(请不要争论这是否正是句法糖)可能会出现问题并导致“句法糖尿病”。它有两个可能的问题。
不太重要的是一致性——如果你可以用多种同样有效的方式做一件事,这会在代码中引入不一致和“正确的做事方式”的毫无意义的论据。在这种情况下——对于 2 行字符串,您是否使用文本块?您是否应该对简单字符串进行多行格式化?您是否应该配置 checkstyle 规则以拒绝一个或另一个选项以及在什么情况下?
第二个也是更大的问题是代码的可读性。我知道这听起来违反直觉,但请耐心等待。Vlad 给出的例子说明了——你想在你的 Java 代码中有一个 20 行的 SQL 查询吗?我会说不——你最好将它提取到一个单独的文件中,并使用某种形式的模板,填充正确的值。当您浏览代码时,这肯定是可读的:
https://www.xiaohongshu.com/discovery/item/6331cfa800000000170174e5
1
2
3
4
5
|
String query = QueryUtils.loadQuery( "age-query.sql" , timestamp, diff, other); // or String query = QueryUtils.loadQuery( "age-query.sql" , Arrays.asList( "param1Name" , "param2Name" ), Arrays.asList(param1Value, param2Value); |
查询可以放在 /src/main/resources 中,并由QueryUtils
. 而且由于之前缺少文本块,您不会喜欢在代码中使用丑陋的字符串连接查询。
https://www.xiaohongshu.com/discovery/item/6346fefd000000000601c9c2
但是现在,有了这个功能,你很想这样做,因为,好吧,它看起来不错。Elasticsearch 查询、JSON 模板等等也是如此。有了这种“糖”,您就有更多的动力将它们放入代码中,可以说,它们会使代码的可读性降低。如果您确实必须调试查询,而不是通过名称来假设其语义并依赖于正确的实现,您可以轻松地age-query.sql
使用它。就像您提取具有一些实现细节的私有方法一样,它使调用方法更具可读性和易于遵循。
仅提供幻灯片)中对此进行了总结。Scala 允许您以多种方式很好地表达事物,这在某些情况下会导致不一致和糟糕的代码可读性。
与直觉相反,有时语法改进可能会降低代码的可读性。因为它们引入了复杂性,并且因为它们使做错事变得更容易。
List<String> list = new ArrayList<String>()
这不是一个普遍的抱怨,当然需要语法糖——如果你可以使用菱形运算符,你就不必写了。但是每个这样的特性都应该被深思熟虑,不仅要考虑编写代码的容易程度,还要考虑阅读代码的容易程度,更重要的是——它激励了哪种类型的代码
在分发捆绑软件时,您有多种选择,但如果我们排除 Docker 和 Kubernetes 等花哨的新手,您将有以下选择:安装程序(适用于 Windows)、相应发行版的软件包(rpm 或 deb)、tarball使用创建必要配置的设置 shell 脚本和虚拟机(或虚拟设备)。
所有这些选项都适用于不同的场景,但分发准备部署的虚拟机映像被认为是企业软件的标准。你的机器有它需要的所有依赖项(因为它可能不允许连接到互联网),它只需要被启动
https://www.xiaohongshu.com/discovery/item/634d0ab5000000000602a474
但通常您需要一些初始配置,或者至少能够向用户展示如何连接到您的(通常是基于 Web 的)应用程序。因此,创建启动屏幕是许多公司选择做的事情。以下是在 CentOS 上执行此操作的简单方法,这是我的首选发行版。(关于这个主题还有其他资源,例它依赖于 /etc/inittab,它在 CentOS 8 中已被弃用)。
1
2
3
4
5
6
7
8
9
|
useradd startup -m yum -y install dialog sed -i -- "s/-o '-p -- \\u' --noclear/--autologin startup --noclear/g" /usr/lib/systemd/system/getty @.service chmod +x /install/startup .sh echo "exec /install/startup.sh" >> /home/startup/ .bashrc systemctl daemon-reload |
使用上面的代码,您将创建一个启动用户并在常规登录提示之前自动登录该用户。像在 getty@.service 中那样替换 Exec 就是这样做的。
然后脚本将启动 bash 脚本的调用添加到 .bashrc 中,该脚本在用户登录时运行。该脚本的作用完全取决于您,下面是使用对话框命令的简单演示(我们刚刚在上面安装):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
#!/bin/sh # Based HEIGHT=15 WIDTH=70 CHOICE_HEIGHT=4 BACKTITLE= "Your Company" TITLE= "Your Product setp" BIND_IP=` ifconfig | sed -En 's/127.0.0.1//;s/.*inet (addr:)?(([0-9]*\.){3}[0-9]*).*/\2/p' ` INFO= "Welcome to MyProduct.\n\n\nWeb CHOICE=$(dialog -- clear \ --backtitle "$BACKTITLE" \ --title "$TITLE" \ --msgbox "$INFO" \ $HEIGHT $WIDTH \ 2>&1 > /dev/tty ) clear echo 'Enter password for user "root":' su root |
此对话框仅显示一些基本信息,但您可以扩展它以允许用户做出选择并输入一些参数。更重要的是,它获取当前 IP 地址并将其显示给用户。这不是他们不能以其他方式自己做的事情,但这样表现出来会更友好。而且您不能对其进行硬编码,因为在每次安装中它都会有一个不同的 IP(即使不使用 DHCP,您也应该让用户设置他们分配的静态 IP,而不是强加给他们)。在脚本结束时,它切换到 root 用户。
这里必须考虑安全性——不应允许您的启动用户在系统中做任何有意义的事情,因为它会自动登录而无需密码决了该问题(例如,当您输入错误的root密码时,您将返回startup.sh脚本而不是控制台)。
我同意这是一个罕见的用例,但我想我会分享这种“神秘”的知识。