`
mmdev
  • 浏览: 13149263 次
  • 性别: Icon_minigender_1
  • 来自: 大连
文章分类
社区版块
存档分类
最新评论

[原创]程序结构随想

阅读更多

程序结构随想

作者:lover_P


[自序]

本来打算这一段时间好好补补算法知识,多写点程序而少写些文字。但今天突然对程序结构有所感悟,不由得写下了这篇文章。

[正文]

所谓程序结构,就是指通常人们所说的“结构化编程”、“面向对象编程”等等。通常,最常见的程序结构包括:

  • 非结构化程序
  • 结构化程序
  • 面向对象程序

当然,还有很多程序结构如“面向组件”程序和“面向方面”程序等等,这些是我所不了解的,不便细说。通常一提到非结构化程序,人们自然而然地会想起汇编语言程序;同时,C语言也可以编写一些非结构化的程序。而结构化程序就多得很了,几乎在高级语言刚出现的时候,所有的高级语言都是结构化的,如FORTRAN、Pascal、C等等。至于面向对象程序,我就更不用说了,现在漫山遍野都是面向对象编程的声音,这类编程语言也有很多,如C++(它并不是纯面向对象的)、Java、C#等。

我这里所想到的,并不是这些语言的应用,而是这些程序结构(以及支持它们的编程语言)之间的辩证关系。

非结构化程序为当今很多程序员所不齿,认为这是一种不好的编程风格。但是,以汇编语言为代表的非结构程序编程语言却是最能直接表达机器行为的,用这些语言编写的这些程序,通常可以以最高的效率运行在特定的平台上。当然,这也要冒着最大的风险并且付出最大的努力。但是,非结构化程序也可以体现出其结构化的一面。譬如,几乎所有的汇编语言都提供call/retPROC/ENDP等语言构造以支持结构化程序的编写。因此,在为了效率而不得不使用汇编语言编写程序的时候,我们应该在追求效率的同时尽量地使用这些语言特性,使得程序更具结构化,这对于代码维护来说是相当重要的。即便你工作在一个非常低级的平台上,该平台的汇编语言不支持call/ret,我们也应该以明确的代码通过利用跳转指令来达到结构化目的。

在结构化程序设计语言出现伊始,人们就为其深深吸引。确实,明确的代码意图、清晰的程序结构使得程序设计不再是一种煎熬,对于代码维护人员来说更是一个福音。因此,结构化程序设计思想以迅雷不及掩耳之势席卷人们的思维,而结构化程序设计语言更是如雨后春笋般地出现。但是,在大家盲目地追求结构化时,我认为,我们应该根据所解决问题的范畴进行灵活的思辨。如果我们为了追求更低的风险和更高的可维护性而使用结构化程序设计语言来书写底层应用,我们应该考虑在结构化程序中引入非结构化思想,譬如,使用全局变量避免函数调用中的传参,使用宏来代替函数调用以减少调用开销等等。当然,这些都是很危险的,要求有很高的语言控制能力才能够完成。另外,如果我们希望我们的代码具有更高的可重用性,我们还可以考虑把面向对象的思想引入到结构化程序设计中,如通过结构体等来保存数据,在一个单独的库中对某一特定类型的结构体定义特定的操作等等。当然,这也是危险的,我们不应该在结构化程序中过度地模拟面向对象程序结构,否则会适得其反,使代码变得一团糟,毫无可读性。

最后,面向对象席卷大地20余年了,其思想可谓深入人心。它是目前最先进的程序设计结构了(其他如“面向组件”、“面向方面”等等不过是对面向对象程序设计的补充和完善)。但是,在其中我们还是能够找到非面向对象的一面。通常,一个对象只有其公共成员和接口成员才是真正为“面向对象”所用的,在它的内部,却相当于一个小型库,其间不乏结构化程序甚至非结构化程序。譬如,我们通常用一些私有成员函数(方法)来辅助公共成员完成特定任务。那么,这些成员便构成了一个对象中的结构化程序,有时,为了效率的考虑,我们将一些数据实现为私有数据成员,好像这个小型库中的全局变量一样,这样在私有成员函数之间互相调用时,就可以减少一些传参的动作。这不就是非结构化思想了么。

上面一同胡侃,大概地说了说在某种程序结构中对另外一种或几种程序结构的体现。我们在实际的编程中,应该根据所要解决的问题灵活地选择一种程序结构,并灵活地运用语言特性适度地体现其他结构的思想,以达到效率和可读性、可维护性之间的最佳平衡。当然,这是一个权衡的过程,也是要求程序写作者有很强的程序写作能力的。还是要多多锻炼,尤其注意锻炼思维的灵活性。

分享到:
评论

相关推荐

    随想出题随想出题免费版

    8. **兼容性**:“随想出题免费版.exe”是程序的执行文件,适用于Windows操作系统,确保在多数个人电脑上都能顺利运行。 9. **免费使用**:作为免费版本,随想出题免费版无需用户支付任何费用,即可享受到基本的...

    程序紫色随想留言簿 v1.0

    若要深入理解这个程序,需要解压并查看这些文件,分析代码结构,了解其运行机制和实现细节。 在开发此类软件时,开发者可能使用了如HTML、CSS、JavaScript等前端技术构建用户界面,后端则可能用PHP、Python、Java等...

    编程随想博客文集 2010

    编程随想博客文集 2010

    编程随想博客文集 2009

    编程随想博客文集 2009

    代码随想录-八股文 pdf

    代码随想录-八股文 PDF 是一个涵盖了程序员学习必备的内容的知识星球精华,总结了包括 C++、Java、Go 在内的多种编程语言,数据结构和算法、操作系统、数据库、计算机网络、设计模式、Linux 等高频考点。该 PDF 由...

    代码随想录-大厂八股文-面试

    它通常包括了变量命名、函数命名、代码结构、注释等多方面的内容。在大厂八股文面试中,代码随想录是一个重要的考察点,考察者需要能够将代码组织得井然有序、清晰易懂。 从标签中,我们可以看到包括了软件、插件、...

    代码随想录知识星球精华 最强⼋股⽂

    知识星球⾥很多录友拿到了⼤⼚offer,包括科班 和 ⾮科班的,⽽他们的每⽇学习总结都是每⼀位准备求职的程序 员必备的内容,也是⾼频考点,⽽这些内容⼜经过了我(程序员Carl)精⼼挑选,所以都是精华中的精华。 录...

    软件随想录 软件随想录

    《软件随想录》是一本深入探讨软件开发与管理的经典著作,它涵盖了软件工程的多个重要方面,旨在为读者提供对软件行业的深度洞察。作者通过一系列的随笔和思考,揭示了软件开发过程中的关键问题、挑战以及解决之道。...

    编程随想博客匿名术文集 2009~2015

    编程随想博客匿名术文集 2009~2015

    代码随想录算法PDF.rar

    《代码随想录》是一本深受程序员喜爱的算法学习书籍,尤其对于初学者来说,它提供了深入浅出的讲解和实战演练。这本书的核心是通过实际编程来帮助读者理解和掌握算法,提升编程技能,特别是C++语言的应用。在C++这个...

    代码随想录算法PDF.zip

    在《代码随想录》中,作者详细介绍了常见算法问题的解决思路和方法,涵盖了数据结构、排序算法、搜索算法等多个方面。以下是书中的部分关键知识点: 1. **基础数据结构**:包括数组、链表、栈、队列、哈希表、树...

    代码随想录知识算法讲解PDF

    代码随想录贪心算法知识,非常管用

    代码随想录 面试大厂必备八股文

    4. 操作系统:了解操作系统原理,如进程与线程、内存管理、文件系统、网络模型等,能够帮助我们理解程序在系统层面的运行机制,从而优化系统资源的使用。 5. 计算机网络:TCP/IP协议栈、HTTP/HTTPS协议、网络编程、...

    随想日语晶典2004注册器

    随想日语晶典2004注册器.exe 随想日语晶典2004注册器.exe 随想日语晶典2004注册器.exe

    软件随想录全集

    2. **重构**:Martin Fowler是重构领域的权威,他提倡在不改变软件外在行为的情况下改进其内部结构。书中列举了大量的重构模式,如提取方法、替换条件为函数、消除重复代码等,这些模式能帮助开发者提高代码质量,...

    随想VB字符串表达式运算控件

    随想表达式运算控件可以使您的应用程序轻松具备用户自定义运算功能。使您开发通用、强大的数据处理系统、电子表格系统成为可能。 目前,随想表达式运算控件支持的运算有: 1.四则混合运算 2.括号 3.以下基本...

    代码随想录-大厂八股文稀有资源好几百页

    代码随想录-大厂八股文稀有资源好几百页 本资源是一个关于代码面试和算法的综合资源,涵盖了C++、Java、Go等多种编程语言,涉及到Linux操作系统和数据结构等多个领域。以下是从该资源中提取的知识点: 一、C++基础...

    代码随想录的pdf版本,需要准备秋招的小伙伴们看过来呀!

    《代码随想录》是一本深受程序员喜爱的书籍,尤其对于即将参加秋季招聘的计算机科学和技术专业的学生们来说,它是提升编程技能和算法能力的重要资源。这本书深入浅出地讲解了编程思维和各种常见算法,旨在帮助读者...

    代码随想录 动态规划、回溯、递归、二叉树、贪心

    二叉树(Binary Tree)是数据结构中的重要组成部分,它有根节点、左子树和右子树。二叉树相关的算法包括遍历(前序、中序、后序)、查找、插入和删除操作。在《代码随想录》中,读者可以学习到如何利用递归或迭代的...

    随想命令按钮控件 V3.0 Build 0401.zip

    随想命令按钮控件V3.0 Build 0401是一个专为开发者设计的软件组件,用于在应用程序中创建和定制独特的用户界面元素,尤其是命令按钮。这个控件提供了比标准Windows控件更丰富的功能和自定义选项,使得开发者能够以...

Global site tag (gtag.js) - Google Analytics