我已经阅读了一些关于所有主题的文章,但我并没有完全区分.
procedural-programming functional-programming structured-programming
当我遇到编程问题时,我自然会开始将它们分解为我脑子里的逻辑对象.谁有责任,谁拥有什么,谁来自什么,等等.
我正在与C斗争.我只是不知道如何用程序语言做事.
有经验的C程序员可以帮助解释我在设计时如何考虑我的程序吗?
例如,我想编写自己的Semaphore类.我自然需要一个队列的数据结构,我也想自己编写.如果我需要在Java或C#中执行此操作,我可以简单地编写一个快速的Queue类,并在我的Semaphore类中创建它的新实例.
但在C中,没有对象.那么我是否必须内联我的Queue数据结构的所有行为?
有人可以帮我"搞定"吗?
根据我的经验,我经常会看到一些设计模式,比如访问者模式,策略模式......,像Java这样的面向对象语言......但我还没有看到像C这样的过程语言中有太多的模式...我想知道那些程序语言中存在哪些模式?
假设我决定用C或任何其他过程编程语言编写大型应用程序.它具有调用依赖项的函数,如下所示:
A
|
+-------------+
| |
B1 B2
| |
+------+ +------+
| | | |
C11 C12 C21 C22
Run Code Online (Sandbox Code Playgroud)
显然,单元测试叶片功能,C11,C12,C21和C22非常简单:设置输入,调用功能,断言输出.
但是,为B1,B2和A进行良好的单元测试的正确策略是什么?
将依赖注入建议B1(和B2也)可以作为随后宣布?
// Declare B1 with dependency injection for invoking C11 and C12.
int B1(int input, int (*c11)(int), int(*c12)(int));
Run Code Online (Sandbox Code Playgroud)
但是,如果我有多层呼叫,那么这种策略似乎不具备可扩展性.想象一下声明的A样子:
int A(int input, int (*b1)(int, int (*)(int), int(*)(int)),
int(*b2)(int, int (*)(int), int(*)(int)),
int (*c11)(int),
int (*c12)(int),
int (*c21)(int),
int (*c22)(int));
Run Code Online (Sandbox Code Playgroud)
呸!一定有更好的方法.
有时,我觉得DI和其他旨在促进模块化和易于维护的类似模式实际上会妨碍代码清晰度,并使简单编码变成无意义的抽象和复杂的间接变得复杂.
C中的大型软件项目(如Perl和Ruby)如何处理单元测试?
最近有人看了我的代码并评论说它过于程序化.需要说明的是,他们看到的代码并不多 - 只是一个部分清楚地概述了应用程序中采取的逻辑步骤.
if(downloadFeeds(ftpServer, ftpUsername, ftpPassword, getFtpPathToLocalPathMap())) {
loadDataSources();
initEngine();
loadLiveData();
processX();
copyIds();
addX();
processY();
copyIds();
addY();
pauseY();
resumeY();
setParameters();
}
Run Code Online (Sandbox Code Playgroud)
然后,这些不同的方法创建了一大堆不同的对象,并根据需要在这些对象上调用各种方法.
我的问题是 - 是一段明确驱动你的应用程序的代码,例如,指示程序编程,如果是这样,那么实现相同结果的更多OO方式是什么?
所有评论都非常感谢!
我来自一个相当强大的OO背景,OOD和OOP的好处对我来说是第二天性,但最近我发现自己处于一个与程序编程习惯相关的开发工作室.实现语言具有一些OOP功能,它们不以最佳方式使用.
更新:每个人似乎对此主题都有意见,我也是如此,但问题是:
是否有任何良好的比较研究对比使用过程编程语言与面向对象语言的软件开发成本?
一些评论者指出了尝试将苹果与橙子进行比较的可疑性质,我同意准确测量是非常困难的,但也许并非完全不可能.
因此,我所工作的公司在我们的网站上采用了相当无组织的方法.我们所有的脚本都是程序性的,并且抛出了cfinclude.我一直想把它组织成一个内部API,其他Web开发人员会用它来做任何事情(因为做了一个改变让我经历并定位每个需要更新的其他更改实例).
我终于有了一个实例,向老板展示了一下.它遵循我所假设的正常方法(来自我的谷歌搜索).服务层> Gateway&DAO> Beans,有一些工厂可以帮助创建对象.它运作良好,完全符合我的要求.他对它印象深刻并且同意我们需要修改我们的代码并更好地组织它,但是没有看到使用这种面向对象的API调用方法来获取大量cfinclude来完成同样的事情的优势.从本质上讲,从他解释cfincludes的方式来看,它的工作方式与方法调用相同.
他被要求使用我的方法与这个cfinclude的优点,对于我的生活,除了在一个对象内分组相似的数据之外,我真的找不到任何明显的优势.还有什么,或者更确切地说,采用cfinclude方法是否有利?
哪种范例更适合算法的设计和分析?哪个更快?因为我在大学里有一个叫做算法设计和分析的科目,并且对程序有一个时间限制.OOP比程序编程慢吗?还是时差不大?
我想知道无状态编程的好处,并找到了一个分享我的问题的人: 无状态编程的优点?
当我读完答案时,它让我对这个相反的问题感到好奇.有状态编程有哪些优点?似乎最近有很多关注无状态代码,但我对趋势很谨慎.
似乎有状态(即命令式)编程可能比无状态(即功能)编程更适合某些场景,并且我希望能够更好地识别哪些问题可以通过有状态编程来解决.
procedural-programming functional-programming stateful mutable stateless