写个小例子吧 --  很多细节(如校验、判断等等)都略了

其实不是有意写成这样,而是很多朋友都这么写(当然里面也有点夸张的写法)

这么写其实也没什么不好,简单明了,不用动脑子,一看就很直白,

但是如果面向的业务是需要变更的,那会很惨,再是个大型项目,那就更惨了(当然这个例子没啥业务可谈,就是个简单的用户类)

改一下:

这个例子中,简单一看,也没啥不一样的地方,看不出啥果来,最直观的可能就是在调用的时候,简单明了,其实不然:

1. 既然是OOA/D,那么就尽量把类型相关的类型封装在类型里面,尽量减少外部逻辑对类型的影响;

2. 减少类耦合度

3. 代码可读性高,便于日后维护

现在我们给Address添加一个属性楼号 (BuildingNo):

  第一种方式有点麻烦,需要修改UserInfo类和Program类,一个需要新定义属性,一个需要解析地址并给新属性赋值;

  第二种方式稍微简单点,修改Address类即可

另外,这里故意采用了Struct,是想顺便说明一下类型对内存的影响(当然,这里采用struct是错误的):

比如1w的用户中,5000人住在一个小区,那么他们的地址应该是一个就足够了,不用在内存中声明1w个Address对象;

如果采用值类型,那么赋值的时候就等于copy了一份;

如果采用引用类型,那么赋值的时候,只是浅复制了一份,传递了一个指针而已;

现在考虑:

小区之前属于A区,现在行政划分到B区,那么这5000人的Address都是需要修改的,没有谁乐意遍历一遍吧

(这里只是假如在UserInfo中关联了Address的情况,实际项目中,估计没这么设计的)

只是为了说明采用值类型和引用类型的区别,如果犯过以下错误:

OneThreadRun(new Obj(){  ... });

那就要思考这个问题了

------

闲来无事,随便写写,望指正!

关于封装的一个小问题和TA的例子的更多相关文章

  1. Spring笔记 #01# 一个小而生动的IOC例子代码

    索引 Spring容器的最小可用依赖 用XML定义元数据 实例化容器&使用容器 例子中仅包含两种类:英雄类Hero和武器类Weapon. 演示DI:给Hero初始化Weapon 演示AOP:法 ...

  2. 先定一个小目标,自己封装个ajax

    你是否发现项目中有很多页面只用到了框架不到十分之一的内容,还引了压缩后还有70多kb的jquery库 你是否发现项目中就用了两三个underscore提供的方法,其他大部分的你方法你甚至从来没有看过 ...

  3. 利用jdbc简单封装一个小框架(类似DBUtils)

    利用jdbc写的一个类似DBUtils的框架 package com.jdbc.orm.dbutils; import java.io.IOException; import java.io.Inpu ...

  4. Redola.Rpc 的一个小目标

    Redola.Rpc 的一个小目标 Redola.Rpc 的一个小目标:20000 tps. Concurrency level: 8 threads Complete requests: 20000 ...

  5. 自己封装的一个LoadRes组件

    这两周一直太忙,没有好好处理上上上周遇到的一个让我加班到凌晨的问题,这个问题是判断flash的加载. 之前的思路是让flash的人在制作flash的时候,加入了一个回调方法,该方法再会回调我页面的方法 ...

  6. c++学习笔记---04---从另一个小程序接着说

    从另一个小程序接着说 文件I/O 前边我们已经给大家简单介绍和演示过C和C++在终端I/O处理上的异同点. 现在我们接着来研究文件I/O. 编程任务:编写一个文件复制程序,功能实现将一个文件复制到另一 ...

  7. 用MVC5+EF6+WebApi 做一个小功能(三) 项目搭建

    一般一个项目开始之前都会有启动会,需求交底等等,其中会有一个环节,大讲特讲项目的意义,然后取一个高大上的项目名字,咱这是一个小功能谈不上项目,但是名字不能太小气了.好吧,就叫Trump吧.没有任何含义 ...

  8. 教你用webgl快速创建一个小世界

    收录待用,修改转载已取得腾讯云授权 作者:TAT.vorshen Webgl的魅力在于可以创造一个自己的3D世界,但相比较canvas2D来说,除了物体的移动旋转变换完全依赖矩阵增加了复杂度,就连生成 ...

  9. Python:通过一个小案例深入理解IO多路复用

    通过一个小案例深入理解IO多路复用 假如我们现在有这样一个普通的需求,写一个简单的爬虫来爬取校花网的主页 import requests import time start = time.time() ...

随机推荐

  1. 【MyBatis学习笔记】

    [MyBatis学习笔记]系列之预备篇一:ant的下载与安装 [MyBatis学习笔记]系列之预备篇二:ant入门示例 [MyBatis学习笔记]系列之一:MyBatis入门示例 [MyBatis学习 ...

  2. 孤陋寡闻又一遭:ReportEvent API函数(有微软Service官方例子为例)

    API 详解: https://msdn.microsoft.com/en-us/library/windows/desktop/aa363679(v=vs.85).aspx 使用例子: https: ...

  3. 注意android裁图的Intent action

    现在很多开发者在裁图的时候还是使用com.android.camera.action.CROP 来调用 startActivity(). 这不是个好主意. 任何不是依android开头的Action ...

  4. lc面试准备:Implement Stack using Queues

    1 题目 Implement the following operations of a stack using queues. push(x) -- Push element x onto stac ...

  5. cout输出字符串指针

    先给出通过字符型指针输出字符串的示例代码,如下: #include <iostream>using std::cout;using std::endl; int main(){ const ...

  6. WordPress /wp-admin/includes/post.php user_ID 参数操作权限提升漏洞

    漏洞版本: WordPress 3.6 漏洞描述: Bugtraq ID:62346 CVE ID:CVE-2013-4340 WordPress是一种使用PHP语言开发的博客平台,用户可以在支持PH ...

  7. 【响应式Web设计实践 #BOOK#】

    <!doctype html> <html> <head> <meta charset="utf-8"> <title> ...

  8. 数学(概率)CodeForces 626D:Jerry's Protest

    Andrew and Jerry are playing a game with Harry as the scorekeeper. The game consists of three rounds ...

  9. Connection 和Dispose的学习日志

  10. 最大流算法---Edmond-Karp

    这个算法是基于FF方法,就是通过不断求残余网络的增广路来增广流量,直到找不到增广路为止.注意:每次找到增广路以后都要更新原网络.EK算法通过BFS寻找源S到汇T的一条最短路径,因此时间复杂度是O(VE ...