python面向接口编程的好处_面向对象编程的重要性在哪?

2016-5-10 16:03:补充

个人觉得,相对于面向过程的思维和编程,优点是直接,编程直奔主题和结果,早期的开发,设计成本低。对于规模小的功能和实现,一次性开发和使用的程序,以及对于很多不确定的程序的开发初期,很自然的会采用这种方法。在初学 c 语言时,尤其是采用和强化了这种思维模式。

缺点是通常没什么层次,很容易使得“可复用”的部分和具体的“逻辑”耦合在一起,使得里面的复用部分往往也难以复用。所以,面向过程的代码,容易被淹没在没有层次感的大量代码之中。对于项目的维护和可重构来说,是不利的。

而面向对象编程,就封装性来说,对算法,数据做了一些分类。对外暴露了经过设计的接口。这使得业务逻辑也被划分的更清晰和更有层次感,使得程序员可以每次专注于一个整体中具体的细分局部来工作。因此,有利于多个人协同合作。

如果仅仅使用了封装性,继承性,那么就仅仅是基于对象。面向对象最重要的特性,是利用其多态性(也就是说,使用 OO 时,你只有使用虚函数,并且通过祖先的接口来操作它们,你才能感受和发挥出 OO 语言的威力和优点,以及 OO 的美妙之处),最终对项目的层次定义的更加清晰合理。在不影响整体设计框架的情况下,你可以通过多态性,随时定义,调整和定制某一个具体对象的个性化行为。

当然,要做到这一点也不是很容易,最终结果通常不可能是你最早就能预见的。往往需要随着开发的进行,不断的调整各个接口的定义,才能逐渐达到最终的合理状态。因此,开发过程中初期开发成本还是略高的。等到这些定义成熟以后,它的易用性,和可维护性上面,都要比面向过程的代码更有优势。

此外,编译器对 OO 编程语言的辅助作用,对程序员来说是一个很重要的帮助。例如,编译器承担了析构临时对象的责任(程序员只需要专注于把析构函数写好就行了)。这使得我们在使用对象时,减轻了一些内存管理和资源维护的负担。例如,在 c 语言的一个函数中,如果申请和打开多个资源,你需要认真的追踪,负责它们的回收和关闭(尤其是当函数在中间就 return 的情况)。在 c++ 中则可以很轻松的随时定义一个临时对象就够了(因为编译器会在适当的时候析构它们)。

在下面的原答案中,我主要是提出了对曾经我看到的一些观点的不认同,一些人对于 OO 的理解过于僵化,以及把非 OO 视为洪水猛兽,这些看法太绝对。就和一些人套用设计模式一样,太生硬太形式化就不好了。

你有两种选择:OO 的,非 OO 的。

----

面向对象最重要的功能,是在语言层面,做出一些归类和划分。这给出了额外信息,有助于提高程序的可维护性,和可控。

也就是说,传达出,数据之间,函数之间,数据和函数之间的疏密和逻辑关系。通过对复杂任务,化整为零,实现分工协作和任务简化,这类似分治法。

同时,在编程模型中建立了对象的概念,通常更加切合人类的思考习惯,通过合理的封装,设计良好的对象接口,从而帮助人们更容易开发和管控自己的代码。

关于楼主提问,我补充下,OO 的选择 和 GUI 是完全独立无关的。GUI 也可以以面向过程的方式开发。在适合 OO 的各种场合(不一定是 GUI),采用 OO 来编程当然也是十分有益的。

然后面向对象的使用,人们很容易僵化,要谨防:

(1)过度OO。不必要的加深对象关系网络深度,会降低程序的可维护性和可控性,最终失控而导致项目失败。

(2)一些人对面向过程才去完全对立,这是一种教条主义和僵硬呆板的理解。实际上绝对的 OO,必然不是最正确的。不管强行 OO 只能是弄巧成拙的愚蠢人。意识不到,OO 并不是适用所有模型,或者说,很多场合,没有必要 OO和没有 OO 的特别收益。

实际情况,一般是 OO 和 面向过程两者的合理结合组合,来解决问题。而不是非此即彼的关系。

以前我经常在技术论坛看到有人说,这不 oo 呀,他们要是看到 oo 语言的汇编结果,只怕要痛苦自杀了。。。。

--

2016年7月18日补充:

我承认,使用 OO 中的多态 / 面向接口的编程,确实是 OO 中最让人感到享受的优美之处。会让你由衷的产生 WOW 的赞叹。

当然,它也有缺点,比如说隐藏了一些东西在机制之下,代码流隐晦了很多,它不像 C 语言那么直观,没有隐藏,你很清楚都调用了什么东西。这有时候会让你分析流程和 debug 的时候,找到具体被执行的代码片段时,显得有些繁琐和费劲。

此外,还有一种很常见的现象,虽然我们很像面向一个通用接口编程,下面的个性越个性越好,越多态越好,然而有得就有失,所以也总是会有一些对象,它就是太个性以至于另类的有点过头,它大部分行为都可以归于通用接口中,然而它又有一些个性化行为,只有它有,而其他人都不需要有。

这时候就会显得很尴尬。如果我们要把通用接口指针,根据情况,转换成这个对象的指针,那么就破坏了 OO 的优雅和优美!强迫症都犯了!

然而,如果我们为了接口的统一,把这个对象独有的行为添加到通用接口中去,那么就意味着通用接口看起来有点别扭,挂着一个大家一看就知道是专属于张三需要的东西。其他人都不需要。。不伦不类的。

此外,OO 有一个继承树,在开发初期是很不稳定的,它在开发过程中往往随着发现新的需要而不断的调整和修正,这个树是牵一发而动全身的关系,一动就会比较麻烦,所以这时候的开发成本是有点高的。

当你把一些通用行为在比较高层(继承树中距离 root 距离小)的接口中实现,可以让它的子孙辈低成本的享用这些通用功能的时候,这时候感觉还是蛮爽的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
面向对象编程(Object Oriented Programming,简称OOP)是一种编程范式,它将现实世界中的事物抽象成对象,通过封装、继承、多态等概念,实现代码的重用性、可维护性和扩展性。Python作为一门面向对象编程语言,提供了强大的面向对象编程机制,如类、对象、继承、多态、封装等。下面我们就来深入理解Python面向对象编程。 1. 类与对象 在Python中,类是一种抽象的数据类型,用来描述具有相同属性和方法的对象的集合。对象则是类的实例,是类的具体实现。Python中定义类的语法为: ``` class ClassName: # 属性 # 方法 ``` 其中,类名一般使用大写字母开头,属性是描述对象特征的变量,方法是对象能够执行的操作。 通过类可以创建对象,如: ``` class Person: def __init__(self, name, age): self.name = name self.age = age p = Person("Tom", 20) ``` 上述代码中,我们定义了一个名为Person的类,并创建了一个Person类的实例p。其中,__init__方法是类的初始化方法,在创建对象时自动调用,用于初始化对象的属性。 2. 继承与多态 继承是OOP中的重要概念之一,它可以使子类继承父类的属性和方法,从而避免代码的重复。Python中的继承语法为: ``` class ChildClassName(ParentClassName): # 属性 # 方法 ``` 其中,子类继承父类的属性和方法,可以通过super()方法来调用父类的方法。 多态是OOP中的另一个重要概念,它指的是同一个方法在不同的对象上有不同的表现形式。在Python中,多态可以通过方法的重写来实现。 ``` class Animal: def sound(self): print("Animal sound") class Dog(Animal): def sound(self): print("Dog sound") class Cat(Animal): def sound(self): print("Cat sound") a1 = Animal() a1.sound() d1 = Dog() d1.sound() c1 = Cat() c1.sound() ``` 上述代码中,我们定义了一个Animal类和两个子类Dog和Cat,它们都重写了父类的sound()方法。当我们创建Animal、Dog和Cat的实例,并调用sound()方法时,它们分别输出不同的声音。 3. 封装 封装是OOP中的另一个重要概念,它指的是将对象的属性和方法封装起来,隐藏内部实现细节,只暴露必要的接口。在Python中,封装可以通过访问控制来实现。Python中的访问控制分为公有、私有和受保护三种类型。 - 公有属性和方法:可以在类内外任意访问。 - 私有属性和方法:只能在类内部访问,外部无法访问。 - 受保护属性和方法:只能在类内部和子类中访问,外部无法访问。 Python中的访问控制可以通过在属性和方法名前加上“_”或“__”来实现。 ``` class Person: def __init__(self, name, age): self.name = name self._age = age self.__height = 180 def get_height(self): return self.__height p = Person("Tom", 20) print(p.name) print(p._age) print(p.get_height()) ``` 上述代码中,我们定义了一个Person类,并创建了一个名为p的实例。在初始化方法中,我们定义了一个公有属性name,一个受保护属性_age和一个私有属性__height。在类外部访问这些属性和一个公有方法get_height()时,我们可以看到私有属性__height可以通过get_height()方法访问,而受保护属性_age可以直接访问。 以上就是Python面向对象编程的深度理解。面向对象编程是一种非常强大的编程范式,可以提高代码的重用性、可维护性和扩展性,对于复杂的项目来说,面向对象编程是必不可少的。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值