OOP过度抽象
OI的时候,解决问题是第一位的,别老想着可维护性。能过就行啦,又不是工程。
下面是两篇相关的文章
来自酷壳 编程真难啊
2009年9月3日 陈皓
上周,在Sun的Java论坛上出现了一个这样的帖子,LZ的贴子翻译如下:
大家好,我是一个Java的新手,我有一个简单的问题:请问我怎么才能反转一个整数的符号啊。比
如把-12转成+12。是的,毫无疑问这是个简单的问题,但我弄了一整天我也找不到什么好的方法。
非常感谢如果你能告诉我Java有什么方法可以做到这个事,或者告诉我一个正确的方向——比如使
用一些数学库或是二进制方法什么的。谢谢!
这个贴子的沙发给出了答案:
n = -n;
然后:
public interface Negatable<T extends Number> {
T value();
T negate();
}
public abstract class NegatableInteger implements Negatable<Integer> {
private final int value;
protected NegatableInteger(int value) {
this.value = value;
}
public static NegatableInteger createNegatableInteger(int value) {
if (value > 0) {
return new NegatablePositiveInteger(value);
}
else if (value == Integer.MIN_VALUE) {
throw new IllegalArgumentException("cannot negate " + value);
}
else if (value < 0) {
return new NegatableNegativeInteger(value);
}
else {
return new NegatableZeroInteger(value);
}
}
public Integer value() {
return value;
}
public Integer negate() {
String negatedString = negateValueAsString ();
Integer negatedInteger = Integer.parseInt(negatedString);
return negatedInteger;
}
protected abstract String negateValueAsString ();
}
public class NegatablePositiveInteger extends NegatableInteger {
public NegatablePositiveInteger(int value) {
super(value);
}
protected String negateValueAsString () {
String valueAsString = String.valueOf (value());
return "‐" + valueAsString;
}
}
public class NegatableNegativeInteger extends NegatableInteger {
public NegatableNegativeInteger (int value) {
super(value);
}
protected String negateValueAsString () {
String valueAsString = String.valueOf (value());
return valueAsString.substring(1);
}
}
public class NegatableZeroInteger extends NegatableInteger {
public NegatableZeroInteger (int value) {
super(value);
}
protected String negateValueAsString () {
return String.valueOf (value());
}
}
有人说,要用try catch;有人说要使用XML配置文件……,程序员们在追逐更为变态和疯狂的东西,并从中找
到快乐,呵呵。
来自酷壳 代码重构的一个示例
首先,我们有一个表达式如下所示:
s = 7;
很明显,这个表达式的变量名太没意义了,很不利于程序的可读性,所以,我们需要取一个有意义的变量名:
slots = 7;
很好,不过,那个常量7
是hard-code
或是一个Magic number
,而且,这常量没有名字也不利于代码的可读性
啊。再改:
SEVEN = 7;
...
slots = SEVEN;
靠!上面,是这是哪门子的改法?(不过,我保证这是真实发生的),常量名也要有意义一点嘛,再改:
SLOTS_PER_WIDGET = 7;
...
slots = SLOTS_PER_WIDGET;
这还差不多,不过,名字可能会重名啊,最好放到一个类中:
import widgetConstants;
...
slots = widgetConstants.SLOTS_PER_WIDGET;
现在看起来好很多了,不过,即然面向对象了,我们当然要学会使用Design Pattern
,比如Factor
啊,或是Singleton
啊什么的:
widgetModelFactory = WidgetModelFactory.getInstance();
widgetModel = widgetModelFactory.getWidgetModel() ;
slots = widgetModel.getSlotsPerWidget();
当然,要是考虑到整体的类结构,上面的那些还不够,下面是我们最终的重构代码:(欢迎来到真实的Java世
界)
context = Context.getCurrentContext();
serviceDirectoryFactory = ServiceDirectoryFactory.getServiceDirectory(context);
serviceDirectory = serviceDirectoryFactory.getServiceDirectory(context);
serviceDescriptor = ServiceDescriptorFactory.getDescriptor("widgetModelFactory");
widgetModelFactoryServiceLocator = serviceDirectory.getServiceLocator(serviceDescriptor,context);
widgetModelFactory = (WidgetModelFactory)widgetModelFactoryServiceLocator.findService(context);
widgetModel = widgetModelFactory.getWidgetModel(context);
slots = widgetModel.getSlotsPerWidget();
这就是我们的面向对象的编程模式,记得N年前在面试那家著名的以鼓吹敏捷方法论的公司时,在用程序实现
一个程序题的时候,他们对我的程序很不屑一顾,原因有两个,其一、我没有使用TDD写UT Case,其二、我
的程序里没有设计模式。(我才知道,编程原来是为了测试和设计模式,而不是为了原来的需求),今天,仅
以此文献给钟爱于那些流行编码风格的程序员们。
OOP过度抽象的更多相关文章
- oop设计模式抽象总结
创建型模式: 一.简单工厂,工厂方法,抽象工厂 简单工厂:只有一层抽象,由工厂去获得抽象类的具体对象,工厂内的方法可以看做静态方法 工厂方法:有两个抽象,工厂的抽象和具体类的抽象. 举个例子: 有个汽 ...
- 关于API的设计和需求抽象
一,先来谈抽象吧,因为抽象跟后面的API的设计是息息相关的 有句话说的好(不知道谁说的了):计算机科学中的任何问题都可以抽象出一个中间层就解决了. 抽象是指在思维中对同类事物去除其现象的.次要的方面, ...
- (转)深入理解Java的接口和抽象类
原文地址: http://www.cnblogs.com/dolphin0520/p/3811437.html 对于面向对象编程来说,抽象是它的一大特征之一.在Java中,可以通过两种形式来体现OOP ...
- python基础-面向对象编程
一.三大编程范式 编程范式即编程的方法论,标识一种编程风格 三大编程范式: 1.面向过程编程 2.函数式编程 3.面向对象编程 二.编程进化论 1.编程最开始就是无组织无结构,从简单控制流中按步写指令 ...
- 深入理解Java的接口和抽象类(转)
深入理解Java的接口和抽象类 对于面向对象编程来说,抽象是它的一大特征之一.在Java中,可以通过两种形式来体现OOP的抽象:接口和抽象类.这两者有太多相似的地方,又有太多不同的地方.很多人在初学的 ...
- 详解Spring框架AOP(面向切面编程)
最近在学习AOP,之前一直很不明白,什么是AOP?为什么要使用AOP,它有什么作用?学完之后有一点小小的感触和自己的理解,所以在这里呢就跟大家一起分享一下 AOP(Aspect-Oriented Pr ...
- 深入理解Java的接口和抽象类
深入理解Java的接口和抽象类 对于面向对象编程来说,抽象是它的一大特征之一.在Java中,可以通过两种形式来体现OOP的抽象:接口和抽象类.这两者有太多相似的地方,又有太多不同的地方.很多人在初学的 ...
- 用Nginx+Lua(OpenResty)开发高性能Web应用
在互联网公司,Nginx可以说是标配组件,但是主要场景还是负载均衡.反向代理.代理缓存.限流等场景:而把Nginx作为一个Web容器使用的还不是那么广泛.Nginx的高性能是大家公认的,而Nginx开 ...
- 程序员必懂:javaweb三大框架知识点总结
原文链接:http://www.cnblogs.com/SXTkaifa/p/5968631.html javaweb三大框架知识点总结 一.Struts2的总结 1.Struts 2的工作流程,从请 ...
随机推荐
- 从偶然的机会发现一个mysql特性到wooyun waf绕过题
从偶然的机会发现一个mysql特性到wooyun waf绕过题 MayIKissYou | 2015-06-19 12:00 最近在测试的时候,偶然的机会发现了一个mysql的特性, 为啥是偶然的机会 ...
- 使用css使textbox输入内容自动变大写
<style type="text/css"> input[type="text"] { text-transform:uppercase; } & ...
- dom4j学习
在使用xml读写的过程中,用到了dom4j,也算是一个比较主流的xml包了,在使用的过程中,将学习经历记录一下,以后查阅也比较方便. 首先是在pom中添加依赖,在Maven的中心库搜索后选择了该包: ...
- Django补充及初识Ajax
Django创建一对多表结构 首先现在models.py中写如下代码: from django.db import models # Create your models here. class Bu ...
- c语言1
1.c语言的执行过程: 源代码:source code,使用某种计算机语言书写的代码. 编译:compile 对源代码进行翻译的过程. 编译器:compiler 负责编译工具. gcc:一款通用的编译 ...
- PHP使用OPENSSL RSA加密解密数据
加密数据有很多种方法,今天我们来看一下OPENSSL RSA的加密办法. 1.首先得安装php的openssl扩展 php -m | grep openssl 执行以上命令,确保已经安装了openss ...
- asp.net中http提交数据所遇到的那些坑
http提交数据有两种形式,get和post,不知道的同学请联系度娘. 1.aspnet:MaxHttpCollectionKeys 业务场景:业务很简单,手机端读取本地通讯录,将所有通讯录提交到后台 ...
- Centos Samba 服务器 iptables 和 SElinux 设置
1.安装samba服务器 # yum install samba 2.配置 # vi /etc/samba/smb.conf security = user (100行左右) 在Share Defin ...
- linux下JsonServer启动
1:进入到JsonServer run.sh目录下; 2:执行"export PATH=.:$PATH"; 3:执行"run.sh start"; 这样便把Js ...
- Android学习笔记 - BitmapFun解析
如果图片资源是静态的,当我们要在View上显示图片时,只需要简单的将图片赋值给ImageView就可以了,但如果需要浏览网络上的图片时该如何做呢?有可能图片很大,有可能网速很慢并且不稳定,这种情况下该 ...