在软件工程中,面向对象编程(OOP)比面向过程编程(OPP)更为常用,这背后有多个原因。
以下是对这一现象的具体分析:
1.需求变更应对
理想情况下用户给了一个需求,程序员吧啦吧啦一写达成需求顺利交付。实际上,给了一个需求吧啦吧啦一写,告诉你不是这样,要啊吧啊吧写。再啊吧啊吧改完演示的时候又是阿西阿西写。用户每次都会说:没事这你就顺手一改,也不是啥大变动。实际只有自己知道这俩要改的天差地别(私下抓狂)。面向对象设计为啥在软工中如此流行就是因为它能处理这种实际情况。面向对象允许更容易地修改和扩展系统。面向过程的代码每次可能要全部改动一遍或全部通读代码,而面向对象只需要改动部分模块中的代码就能保证其他已经实现的功能不受影响。面向对象通过类的继承和多态性来处理变化。当需求变更时,面向对象的方法可以通过增加新的类或修改现有类来适应变化,而不需要重写整个程序。
2.代码复用性提高
面向对象编程鼓励代码复用,通过继承和组合,可以在不同的地方重复使用相同的代码。
这种复用性提高了开发效率,减少了代码维护的工作量。
3.系统结构清晰
面向对象的系统通常具有更清晰的结构,因为对象和类之间的关系反映了现实世界的实体和它们之间的交互。
这种清晰的结构使得系统的设计和实现更加直观,易于理解和维护。
4.模块化设计
面向对象方法支持模块化设计,每个模块(即类)都有明确的职责和接口。
这种模块化使得系统的各个部分可以独立开发、测试和部署,提高了开发效率和系统的可靠性。
具体用哪个
如果是长期项目且逻辑较复杂,只能用面向对象,否则后期修改会改到人死机。
目前来说做的都是机器学习项目,有些科研项目基本都是面向过程来写的,
后期在工程化落地比如产学研结合,应用过程和研究过程完全是两回事。
工程化中最好改成面向对象,将程序模块化。最简单的解耦思路就是将
输入、输出与算法分离,这样确保维护时修改不会导致崩盘。
数据较多时还要考虑测试的便利性。
从开发角度讲,面向过程编程简单直接效率高开发速度快,
面向对象要慢并且模块的设计需要思考和衡量。
但如果这套代码投入使用,改着改着还是会进入解耦阶段
(不然每次都通读代码太痛苦了!!而且写完一段时间再回头看都不知道是哪个sb写的。)
总的来说,面向对象编程之所以在软件工程中被广泛采用,是因为它提供了更好的需求变更应对、代码复用性提高、系统结构清晰以及模块化设计等优势。这些优势使得面向对象编程成为解决复杂软件问题的首选方法。
增加一个python的代码示例,包含测试
import logging
import unittestlogging.basicConfig(level=logging.DEBUG)
logger = logging.getLogger(__name__)def read_data(file_path):logger.debug(f"Reading data from {file_path}")# Read data logic herereturn []def process_data(data):logger.debug("Starting data processing")# Process data logic herereturn datadef validate_data(data):logger.debug("Validating data")if not isinstance(data, list):raise ValueError("Data should be a list")for item in data:if not isinstance(item, dict):raise ValueError("Each item in the data should be a dictionary")return Trueclass TestDataProcessing(unittest.TestCase):def test_read_data(self):data = read_data('test_file.csv')self.assertIsInstance(data, list)def test_process_data(self):data = [{'key': 'value'}]processed_data = process_data(data)self.assertEqual(processed_data, data)def test_validate_data(self):data = [{'key': 'value'}]self.assertTrue(validate_data(data))with self.assertRaises(ValueError):validate_data([])if __name__ == "__main__":unittest.main()
———————————— 有好的模块设计思路框架可推荐一下,感谢 !———————————————