最近针对OO有了太多的讨论,太多的误会,太多的不理解。让我来一次性解决什么是对象,为什么要面向对象的问题吧,这是第一篇。
所谓面向对象的编程、设计、思想。我们用大白话来说。
面向对象就是用 某物(对象),是什么(类),有什么(对象的状态),能干什么(方法)的方式来描述程序的方法。这就是面向对象。
面向对象的程序的特征,封装性:也就是某物状态的改变,必须是他自己的行为来改变。
打个比方,我(人类),有钱(有什么),你(人类),要找我借钱(能干什么)。于是
class Man()
{
private int money;
public int Money
{
get{return money}
set{money=value}
}
public void Borrow(Man Target,int Howmuch)
{
money+=Howmuch;
Target.Money-=Howmuch;
}
}
就是这个样子。这样子的写法是不对的,这样破坏类的封装性,我们绕过了Man的对象,直接去操作了对象的状态。这完全是强盗逻辑,跟你直接到我钱包里掏钱一样不可饶恕。所以,借钱这个动作还需要我来参与,你找我借钱,而我,要借给你钱。我们修改一下类的代码。我们给Man类增加一个Lend的方法,以封装在借出钱的时候对自身状态的改变。然后借钱的行为也要更改了。
class Man()
{
private int money;
public int Money
{
get{return money}
set{money=value}
}
public bool Lend(int Howmuch)
{
if(Howmuch<money)
{
money-=Howmuch;
return true;
}else
{
return false;
}
}
public void Borrow(Man Target,int Howmuch)
{
money+=Howmuch;
Target.Lend(Howmuch);
}
}
这样子的代码就是满足了封装性的原则,注意,封装既是特征,也是必须满足的条件,如果破坏了封装性原则那就是破坏了OO的原则。
这里回到了一个很实际的问题,失血模型为什么不OO。
我们定义了Book类,封装了Book的状态(属性)。如果我们用一个BookManager类去Save这本书(典型的失学模式的做法)。那么,我们在BookManager中如何保存?很多人在BookManager.Save里读取Book的属性,生成SQL,写数据库,返回执行结果。这样子OO么?不OO,因为这种做法完全破坏了封装性的原则。就跟之前借钱的例子一样。所以我们要在Book类增加一个Save方法,这个方法是用来维护Book类本身的状态的。而很多的ORM也能够给我们的类注入这类方法,使我们的的类具备持久化的能力。这样Book的属性,如何在数据库里存储,如何读取,如何删除都是Book自身来负责,因为在数据库里关于Book 的记录都是属于Book的状态,所以都需要Book自身来封装,使其透明化。
很多人在之前我写的Book.Save是否OO的话题里面说,觉得Book.Save方法仅仅是换了个位置。但是哪里知道,这个小小的改变却是一个原则性的问题。而至于双鱼座觉得在Save里加入上下文的参数更加符合实际情况,我个人觉的加和不加对Book类是否符合OO的原则没有太大的影响。
但是有和没有确是天壤之别了。
封装是保证系统的高内聚低耦合的很重要的设计原则。
还是用Book作为例子,如果你的Book需要添加一个属性来表示新的状态(换句俗话就是你在数据库里加列了,数据库变化了)。如果你的Book类自己维护了自己的持久化状态,那么你就只需要修改Book类的持久化状态的方法。如果你使用的VS2005的话,使用重构功能一次性就能把所影响到的地方全部修改(java的用Eclipse也有同样的功能)。而如果没有封装的话。那么你可能需要改的还有BookManager,如果在其他地方还用到了Book,可能还有数不清的代码在等着你改。为什么会麻烦,因为没有了封装,类和类之间产生了耦合。
下一章我们会接下来谈继承(也包括接口的Implement)
分享到:
相关推荐
在IT行业中,开发环境的配置是开发者日常工作中不可或缺的一部分。本教程主要关注的是如何...通过阅读《手把手系列-Eclipse+JBossIDE+JBoss开发环境配置.pdf》这份文档,你将能够更详细地了解每个环节,并实践操作。
【NAMD手把手教程--第一部分】 分子动力学模拟是一种基于计算机的科学研究方法,它运用牛顿力学原理来模拟大分子系统,如蛋白质、核酸等的动态行为。这种技术起源于20世纪50年代,随着计算能力的提升,已经成为生物...
手把手 教程 淘宝客推广 入门到精通
非常详细,一步一步教你搭环境
JEECG3.4.3-MAVEN 版本手把手入门-eclipse 本文将详细介绍 JEECG3.4.3-MAVEN 版本的入门指南,使用 Eclipse 作为开发工具,通过 Maven 进行项目构建和管理。 一、Maven 环境搭建 Maven 是一个基于项目对象模型...
[第6讲]手把手教你WebAccess-动态对象与静态对象的重叠flv,WebAccess-动态对象与静态对象的重叠
1. **封装**:封装是面向对象编程的基本原则之一,它隐藏了内部实现细节,仅对外提供接口供其他部分使用。在模块化中,封装意味着将一组相关的函数、变量和类组合在一起,形成一个独立的单元,对外暴露有限的接口,...
JEECG是一个基于代码生成器的脚手架,提供了一套快速开发平台,能够快速搭建企业级的Web应用。Maven是一个项目管理和构建自动化工具,它使用基于XML的配置文件,将项目的构建过程规范化,让项目结构更加清晰。 本...
面向对象编程(Object-Oriented Programming,简称OOP)是一种编程范式,它基于“对象”的概念,将数据和操作这些数据的方法封装在一起。在C#中,面向对象编程是核心特性之一,允许开发者创建复杂、可维护且可扩展的...
《Dreamweaver网站设计系列多媒体教程(手把手系列6-11集)》是一套针对初学者和进阶者设计的教程,旨在帮助用户掌握Adobe Dreamweaver这一强大的网页设计工具。本教程涵盖从基础操作到高级应用的全方位教学,通过第6...
在"Quest3D 手把手教学系列6-10讲"中,我们将会深入探讨这款软件的一些高级特性,帮助你进一步提升在3D开发领域的技能。 第一讲:Quest3D第06讲---阳光光晕和种植树木 这讲主要介绍了如何在Quest3D中模拟自然环境中...
JEECG是一款基于代码生成器的轻量级快速开发平台,适用于快速搭建企业级应用系统。本教程将详细介绍如何在Eclipse环境下配置和使用Maven管理JEECG项目。通过本教程的学习,读者将能够掌握Maven的基本配置、Eclipse...
手把手教你学DSP--基于TMS320C55x光盘 (包括源代码 电路图PDF,DXP) + 基于TMS320C55x.PDF。比较适合刚入门,是一本DSP入门的好书。
《Dreamweaver网站设计系列多媒体教程(手把手系列0-5集)》是针对初学者和进阶者设计的一套全面的网页制作教程,涵盖了从基础到实践的多个环节。这套教程通过生动的多媒体形式,旨在帮助用户掌握Adobe Dreamweaver这...
django-docker 手把手的 django-docker-mysql-nginx-gunicorn 部署教程
本教程"Quest3D 手把手教学系列1-5讲"是初学者入门的绝佳资源,涵盖了从基础到进阶的各种主题。教程分为两部分,1-5讲和6-10讲,旨在逐步引导学习者掌握Quest3D的基本操作和核心概念。 在第一讲"最简单的开始"中,...
Maven是一个项目管理和构建自动化工具,使用项目对象模型(POM)概念,用XML表示项目的配置信息。 #### Maven环境搭建 1. **下载Maven**: 访问Maven官方网站下载最新版本,如apache-maven-3.1.1-bin.zip。 2. **...
LabVIEW 面向对象编程(oop)-简单工厂模式程序Demo,基于Modbus的RS485通讯,程序Demo已经过初步验证 测试效果良好,整体操作过程已录制视频(视频时长40分钟),手把手进行讲解简单工厂模式的注意点和编写步骤,手把手教...
系统封装图文教程经典手把手教程一学就会,非常简单。
系统封装教程手把手教你从零开始系统封装教程 本文将详细指导读者从零开始制作属于自己的Windows 7封装系统,涵盖了整个系统封装过程中的步骤和注意事项。 一、封装前准备 在开始制作封装系统之前,需要准备以下...