文档章节

绝不在java中用string(或者少用)

hxf10047
 hxf10047
发布于 2015/11/27 19:42
字数 1178
阅读 349
收藏 9

不要使用未包装的String or long or int. 这是为什么呢? 因为这些原始类型没有语义含义。 他们很难理解,维护以及扩展. 我一直再宣传这个概念 ,“Object calisthenics” finally prompted be to write this post. 

假如现在有一个关于电影预订的系统。

更新:如果你只是丢下一个评论告诉我你找到了反抗我的理由,好吧,只是不要这么做。我欣赏你的意见,但坐下来,想想和并去实践。当你读别人写的代码“String id”,你会疑惑id到底是什么,回来读读我这篇文章代码。

.把

public void bookTicket(

  String name, 

  String firstName, 

  String film, 

  int count, 

  String cinema);

和这段比。(我所知面向对象编程)


public void bookTicket(

  Name name, 

  FirstName firstName, 

  Film film, 

  Count count, 

  Cinema cinema);

二是非常容易理解的,尤其是当你的IDE是完成一个方法调用bookticket(String arg0,String  arg1,String  arg2,int arg3,String arg4)与bookTicket(Name arg0, FirstName arg1, Film arg2, Count arg3, Cinema arg4). 。二是更容易阅读。


void book(String orderId);


void book(OrderId order);

对比。


在第一个例子中‘开发’者看着代码会有两种疑问


a.) 从哪获取orderId 同时 b.) orderId 到底是1212", "ABC-123"或者 "12-34-45-SCHWEINEBACKE",这三种情况的哪一个. 在第二个例子中,他可以搜索这个OrderId类的位置,发现关于它的使用,读javadoc,同时知道验证,并且应用到项目中.(译者以为这就是方便项目合作‘开发’)。 你可能会想 orderId 就是orderId,很容易理解。遗留系统通常不一致的更改id,命名和语义. 我见过的系统把订单 ID 命名为“OrderID”,“auftragsid”,“id”等其他几个命名,同时它们都表示同一个!


一个有语义类比String更容易理解。‘开发’者们不易陷入混乱。如果你依靠静态类型和使用startic型语言(对象和引用)然后你最大化效益,创造更多的类。将来OrderId class很容易用long来代替int,并且仍然可以使用验证和id的生成逻辑。但是更难扩展的以字符串为基础的版本。


通过优雅的接口实现


类应该被实现为一个简单的域类,有时是不可改变的值对象,它只包字符串并将某些语义附加到字符串中。

public class Name {

   public Name(String name) {

      ...

   } 

   public static Name name(String name) {

     return new Name(name);

   }

}

人们会疑问为什么这么麻烦。假定如下


new Customer(new FirstName("Stephan"), new Name("Schmidt"));

是不是比一个字符串语义更麻烦

new Customer("Stephan", "Schmidt");

尽管这样,第一个例子很容易理解, 通过本地静态方法可以改写成


new Customer(firstName("Stephan"), name("Schmidt"));

这也解决了许多争论,‘开发’商从阅读代码不理解每个参数的手段,尤其是在较长的(重构参数对象!)参数列表。这是另一种方法,以流利的界面建设者。

我的最后一篇文章是如何使用不可变对象的泛型,也可以用值对象代替原始的。

new Point(10,10);

 new Point(x(10), y(10));


where x(10) and y(10) create Xpos and Ypos value objects.


面试 域对象与primitivs


一个我经常喜欢问的问题是关于价格搜索. 我通常给他们如下的样子


... searchByPrice(...)

并让面试者补全代码。一些人会这样写


Vector searchByPrice(double start, double end)

which is bad code from several points of view (using double for money, no domain objects, untyped Vector).


这个是很差的代码,从某些方面看。


Others with more domain based thinking write


其他基于领域考虑的面试者这样写


List<Product> searchByPriceRange(Price start, Price end)

or even us the Range pattern by Fowler:


List<Product> searchByPriceRange(PriceRange priceToSearch)

最后的解决方案很容易扩展和理解。这个问题,往往开始于接口设计的一个有趣的讨论,架构和领域建模。不管你对这个面试问题有什么想法,不要忘记一次,对所有的人:不要使用double定义money。

谢谢你们的倾听,不要使用String,int和long(或double定义money)。

Update:


If you find the usage of Classes instead of Strings repulsive, look at another example, zip code. Most people I’ve seen in lots of code use a primitive for zip code which creates a lot of problems when going i18n.






Customer {

   String name;

   String street;

   String city;

   String zip;

}

(some will have used int for the zip code but get faster into trouble than the String users)


instead of


Customer {

   String name;

   Address address;

 

Address {

   ZipCode code;

}

Still think Strings are a good idea in your code or “the simplest thing that could possibly work”?


你所谓的简单,其实对别人来说不简单。


© 著作权归作者所有

hxf10047
粉丝 1
博文 26
码字总数 11602
作品 0
高级程序员
私信 提问
加载中

评论(7)

hxf10047
hxf10047 博主

引用来自“YangMiao”的评论

用力过猛了吧~~~
YangMiao
YangMiao
用力过猛了吧~~~
啦啦啦拉拉
啦啦啦拉拉
你用过C#吗[11]
hxf10047
hxf10047 博主
我想吐槽一下,怎么在检测文章啊,我里面写个电影票,都不让提交了,我也是醉了
edgar_chan
edgar_chan
这种思想倒是可以借鉴,更精深地面向对象。
hxf10047
hxf10047 博主

引用来自“Sel8616”的评论

小题大作吧
把简单的事情复杂化,并不是高明之举

当然,在复杂的项目中,有些功能可以参考实现,但全盘这样~~~开发人员累死
其实更多说的是扩展性,理解性。实际项目,实际利用
Sel8616
Sel8616
小题大作吧
把简单的事情复杂化,并不是高明之举

当然,在复杂的项目中,有些功能可以参考实现,但全盘这样~~~开发人员累死
【翻译】Java中String, StringBuffer, StringBuilder的区别

String 是 Java 中最重要的类之一,并且任何刚开始做Java编程的人,都会用String定义一些内容,然后通过著名的System.out.println()语句来打印出来。 然而,很多Java新手都不会意识到 String...

YuanyuanL
2014/09/03
457
4
MyBatis传入参数与parameterType

传入简单类型 Java代码: MAPPER : 2. 传入List JAVA代码: 单独传入list时,foreach中的collection必须是list,不不管变量的具体名称是什么。比如这里变量名为idList, collection却是list。 ...

为了美好的明天
2018/05/17
784
0
像Go一样写Java,从Go的特性,讨论一种编程风格。

上篇转帖的blog里面提到了Go的特性,作为编写Java时也可以给自己点编程风格的参考。 下面是提到的改进 下面简单学习和分析一下重点的风格提示,领会Ken和Pike的编程思想: 规范的语法(不需要...

Brin想写程序
2014/03/04
305
0
Android篇 Activity共享元素跳转

什么叫Activity共享元素跳转?我们来看看下面的效果,其实就是在这个转场动画中,整个子布局都是共享元素,当然也可以是图片和文字的任何控件,具体怎么实现这种效果呢? 查看示例图 以MainA...

所谓向日葵族
09/19
16
0
tomcat 环境变量路径中有空格该怎么办

本机 JAVAHOME=C:Program FilesJavajdk1.6.043 通常在服务器会引用 %JAVA_HOME%binjava 环境变量可以用特殊的字符PROGRA~1代替从而达到替换空格方便使用的目的 对带空格的路径在bat代码中用双...

追梦的南瓜
2014/08/18
1K
0

没有更多内容

加载失败,请刷新页面

加载更多

nginx学习笔记

中间件位于客户机/ 服务器的操作系统之上,管理计算机资源和网络通讯。 是连接两个独立应用程序或独立系统的软件。 web请求通过中间件可以直接调用操作系统,也可以经过中间件把请求分发到多...

码农实战
今天
5
0
Spring Security 实战干货:玩转自定义登录

1. 前言 前面的关于 Spring Security 相关的文章只是一个预热。为了接下来更好的实战,如果你错过了请从 Spring Security 实战系列 开始。安全访问的第一步就是认证(Authentication),认证...

码农小胖哥
今天
9
0
JAVA 实现雪花算法生成唯一订单号工具类

import lombok.SneakyThrows;import lombok.extern.slf4j.Slf4j;import java.util.Calendar;/** * Default distributed primary key generator. * * <p> * Use snowflake......

huangkejie
昨天
12
0
PhotoShop 色调:RGB/CMYK 颜色模式

一·、 RGB : 三原色:红绿蓝 1.通道:通道中的红绿蓝通道分别对应的是红绿蓝三种原色(RGB)的显示范围 1.差值模式能模拟三种原色叠加之后的效果 2.添加-颜色曲线:调整图像RGB颜色----R色增强...

东方墨天
昨天
11
1
将博客搬至CSDN

将博客搬至CSDN

算法与编程之美
昨天
13
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部