为数据提供返回String形式的编程访问,不只是toString()
2010-08-29 13:10
295 查看
这个建议来自Joshua Bloch的“Provide Programmatic Access to All Data Available in String Form”。我这里以他的提纲为基础然后结合自己的理解写了这篇短文。
这个建议的意思是如果你写一个模块就要把模块里面可以公开的数据信息以String形式提供给客户。因为如果你不提供这样的String访问接口,那么这个使用这个模块的客户要得到一些这个模块信息的时候会感到很不方便。更糟糕的是可能他自己去解析能够得到的String信息。很多时候这个String就是来自toString()的返回。
他举了个例子就是java.lang.Throwable.getStackTrace()。
这里的getStackTrace()就是很好的例子。当你抓到一个Throwable(一般就是Exception)就可以调getStackTrace()得到StackTraceElement数组,然后用循环把异常的详细信息以String的形式展现出来。而且客户还可以用StackTraceElement的函数对每个StackTraceElement来获取信息。如果没有这个getStackTrace(),用户就要自己从printStackTrace()里面去解析异常的详细信息,解析这个栈的确让人很痛苦。如果说用toString(),您试一下,它只能打出当前栈顶元素的信息。
这里我认为值得强调的是2个地方,一个是"All Data Available"里面的"All",另一个"Available"。先说All,因为你不能假设你的客户代码会永远不访问某个数据,因此要把所有的数据信息都提供出来,也就是做+法。再说Available,这个意思是要访问权限最小化,这也是OO的一个原则,这就是个-法。举个例子,譬如大家都知道ArrayList是由数组实现的,而这个数组的真实大小是小于等于size()的。这个时候要不要提供这个数组的长度的方法呢?当然不要,因为这不是List接口要求,对ArrayList来说用户也不需要关心。
翻看自己以前写过的代码,啊,很多没有遵循这个规则。有些是把所有信息都写到toString(),以至于客户代码要解析toString()的字符。还有些就算是写了toString()也没有涵盖所有的公开信息。很多信息都是在客户代码里面解析实现。因为这样的String一般都是给人看的,所以这样的痛苦的代码都是在写log的时候用的。当他们要在log里面打印这个对象信息的时候,get这个字段,get那个字段,然后判断逻辑最后组成String。 这原本是这个类自己的职责。
这个建议的意思是如果你写一个模块就要把模块里面可以公开的数据信息以String形式提供给客户。因为如果你不提供这样的String访问接口,那么这个使用这个模块的客户要得到一些这个模块信息的时候会感到很不方便。更糟糕的是可能他自己去解析能够得到的String信息。很多时候这个String就是来自toString()的返回。
他举了个例子就是java.lang.Throwable.getStackTrace()。
public class Throwable{ public StackTraceElement[] getStackTrace() ; } public final class StackTraceElement{ public String getClassName(); public String getFileName(); public int getLineNumber(); public String getMethodName(); public boolean isNativeMethod() }
这里的getStackTrace()就是很好的例子。当你抓到一个Throwable(一般就是Exception)就可以调getStackTrace()得到StackTraceElement数组,然后用循环把异常的详细信息以String的形式展现出来。而且客户还可以用StackTraceElement的函数对每个StackTraceElement来获取信息。如果没有这个getStackTrace(),用户就要自己从printStackTrace()里面去解析异常的详细信息,解析这个栈的确让人很痛苦。如果说用toString(),您试一下,它只能打出当前栈顶元素的信息。
这里我认为值得强调的是2个地方,一个是"All Data Available"里面的"All",另一个"Available"。先说All,因为你不能假设你的客户代码会永远不访问某个数据,因此要把所有的数据信息都提供出来,也就是做+法。再说Available,这个意思是要访问权限最小化,这也是OO的一个原则,这就是个-法。举个例子,譬如大家都知道ArrayList是由数组实现的,而这个数组的真实大小是小于等于size()的。这个时候要不要提供这个数组的长度的方法呢?当然不要,因为这不是List接口要求,对ArrayList来说用户也不需要关心。
翻看自己以前写过的代码,啊,很多没有遵循这个规则。有些是把所有信息都写到toString(),以至于客户代码要解析toString()的字符。还有些就算是写了toString()也没有涵盖所有的公开信息。很多信息都是在客户代码里面解析实现。因为这样的String一般都是给人看的,所以这样的痛苦的代码都是在写log的时候用的。当他们要在log里面打印这个对象信息的时候,get这个字段,get那个字段,然后判断逻辑最后组成String。 这原本是这个类自己的职责。
相关文章推荐
- 什么是数据源,DataSource,数据源就是 :任意数据集合的抽象。它提供该数据的类型,并在适当的时候以 InputStream 和 OutputStream 的形式提供对该数据的访问。
- 疑问: Web Service 的返回数值 string的形式返回xml,怎样把数据导入到DataSet中使用?
- String的本质是一个char*,只是以类的形式提供,使用起来比较方便
- Ajax处理XML,XMLHttpRequest对象的创建和访问servlet并返回xml数据到页面展示
- 问题九:编写函数stringcat,实现字符串的连接,程序中需要使用指针形式访问字符串
- 使用ODBC数据提供程序访问MSSQL数据库
- 初涉Ajax,以post或get方法发送数据,以json或xml形式接收服务器返回的请求
- 访问页面返回XML格式的数据
- Android下的数据存储与访问 --- 以文件的形式
- 访问Tomcat服务器返回数据乱码
- 后台返回一个string类型的json格式数据,前台js如何读取?
- 调用部署在本机IIS服务器的WCF服务并返回数据DataTable,一直报错:远程主机强迫关闭了一个现有的连接,但是服务访问正常
- (9)返回xml格式数据,但是用户却收到“该公众号提供的服务出现故障,请稍后再试”
- 数据提供程序或其他服务返回E_FAIL 状态
- spring-boot 实现通过访问路径后加参数返回json数据
- 【转载】使用Json比用string返回数据更友好,也更面向对象一些 |Asp.net MVC 2.0 + Unity 2.0(IoC) + EF4.0 实例:RoRoWoBlog 开源项目框架代码
- 链接服务器 '(null)' 的 OLE DB 访问接口'STREAM' 返回了对列 '[!BulkInsert].field' 无效的数据
- String 类别中已经提供了将基本数据型态转换
- 客户端访问某服务端响应返回相应的数据
- 远程带参数POST访问接口,返回数据