我如何摆脱过程编程的习惯,进入面向对象编程?

2022-08-30 18:10:14

我希望得到一些技巧来帮助我打破这么多年以来我认为的程序化编程的坏习惯。每次我尝试在OOP中做一个项目时,我最终都会恢复到程序化状态。我想我并不完全相信OOP(即使我认为我已经听说了它的一切!

所以我想我经常执行的常见编程任务的任何好的实际例子,如用户身份验证/管理,数据解析,CMS / Blogging / eComs是我经常做的事情,但我无法弄清楚如何在OOP中完成它们并远离程序,特别是因为我构建的系统往往工作和工作良好。

有一件事我可以看作是我开发的失败,那就是我经常重用我的代码,它通常需要更多的重写和改进,但我有时认为这是软件开发的自然演变。

然而,我想改变!给我的程序员同伴们,帮助:)关于我如何摆脱这个讨厌的哈比特的任何提示?


答案 1

当您找不到充分的理由或动机时,使用面向对象编程有什么意义?

你必须受到将想法视为对象的需要的激励。有些人觉得需要感知概念,流程或功能而不是对象,然后他们被激励去面向概念,想法或功能流的编程。

大约13年前,我从c切换到c ++,仅仅是因为有我需要的想法,但c不容易执行。简而言之,我的需求激励了我面向对象的编程。

面向对象的思维方式

首先,你有字节,字符,整数和浮点数。

然后,您的程序开始被各种变量(局部变量和静态变量)弄得一团糟。然后你决定将它们分组到结构中,因为你认为所有通常传递的变量。

数据聚合

因此,就像打印机的信息应该将其所有变量都包含在打印机结构中一样:

{id, name, location,
 impactType(laser|inkjet|ribbon),
  manufacturer, networkAddr},
  etc.

因此,现在,当您通过打印机信息调用一个又一个函数时,您没有具有长参数列表的函数或具有巨大串扰可能性的大量静态变量集合。

信息的纳入

但数据整合还不够好。我仍然需要依靠一堆函数来处理数据。因此,我有一个聪明的想法,或者将函数指针合并到打印机结构中。

{id, name, location,
 impactType(laser|inkjet|ribbon),
 manufacturer, networkAddr,
 *print(struct printer),
 *clean(struct printer)
}

当数据包含有关如何处理/感知数据的过程时,数据会逐渐变成信息。

信息量化

现在,激光,色带和喷墨打印机并不都具有相同的信息集,但它们在信息中都有一组最常见的分母(LCD):

任何打印机通用的信息:ID、名称、位置等

仅在色带打印机中找到的信息:二手自行车,色带(织物|玻璃纸),色带等

仅在喷墨中找到的信息:墨盒等

仅在激光器中发现的信息: ...

对于我和许多面向对象的队列来说,我们更喜欢将所有公共信息量化为一个公共信息封装,而不是为每种打印机类型定义单独的结构/封装。

然后,我们更喜欢使用一个框架来管理每种类型的打印机的所有函数引用,因为并非所有打印机都以相同的方式打印或清理。

所以你远离对象的偏好/动机告诉你,如果你不使用对象,你的编程生活会更容易吗?您更喜欢自己管理所有这些结构复杂性。你一定没有写足够的软件来感受这种感觉。

懒惰的必要性

有人说——必要性是创造力之母。(以及,对金钱的热爱是邪恶的根源)。

但对我和我的同龄人来说,面对必要性时的懒惰是创造力的父母。(以及缺钱是邪恶的另一个父母)。

因此,我敦促你对编程采取一种懒惰的态度,这样最短路径的原则就会进入你的生活,你会发现,但别无选择,只能让自己朝着用对象编程的方向发展。


答案 2

步骤 1.阅读一本好的设计模式书。http://www.oodesign.com/

步骤2.选择你已经知道的东西,并从OO的角度重新设计它。这就是代码 Dojo 方法。采用您已经理解的问题,并定义对象类。

我做了这个 -- 并写下了我所做的。

查看 http://homepage.mac.com/s_lott/books/oodesign.html#book-oodesign

您可以执行相同的一系列练习来掌握OO设计和代码的窍门。


推荐