首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >面向对象语言中的非面向对象编程

面向对象语言中的非面向对象编程
EN

Software Engineering用户
提问于 2014-12-23 04:24:21
回答 3查看 7.2K关注 0票数 15

最近,我被分配了一个任务,用面向对象的编程创建一个具有加法、减法、乘法、除法和幂等功能的计算器。我成功地完成了这项任务。但是之后,我重新编写了整个程序,而没有使用面向对象的技术/方法。

我注意到的是,我的代码长度大大缩短了,这是可以理解的。所以我的问题是什么时候我应该使用面向对象的编程?用面向对象的语言创建没有面向对象的程序可以吗?请帮我解决这件事。

PS:我在这里不是要告诉我面向对象编程比过程编程的优点。

EN

回答 3

Software Engineering用户

回答已采纳

发布于 2014-12-23 06:22:25

C++不仅仅是一种面向对象语言,它还是一种多范式语言。因此,它允许您决定是否支持OO编程,或者将两者混合在一起。使用OO技术可以为您的程序添加更多的结构--当程序达到一定的大小或复杂性时,您将从中受益。然而,这种额外的结构是以额外的代码行为代价的。因此,对于“小”程序来说,最好的方法通常是首先以非面向对象的方式实现它们,并在以后的程序开始增长时添加越来越多的OO技术(这可能不会发生在“锻炼”程序中,但这是许多业务程序的典型生命周期)。

棘手的部分是不要错过时间点,当你的程序的复杂性达到了需要更多结构的规模。否则,你将得到一堆大量的意大利面代码。

票数 25
EN

Software Engineering用户

发布于 2014-12-23 06:01:11

专业程序员是如何判断是否选择面向对象的?这对我很有帮助。

对我来说,有两个决定点。首先,有时在一开始就会很明显。将会有许多相似的类型,它们都共享共同的方法,它们在实现细节上有很大的不同。例如,我正在构建一个工作流系统,我需要实现任意任务的能力。为了运行该任务,我使用Execute()抽象方法实现了每个任务继承的基类。继承类提供了实现,但是工作流系统可以在不知道正在运行什么样的任务的情况下开始执行。

不过,大多数项目都没有那么明确。第二个决定点是,当项目的一个子集已经发展成为一个巨大的混乱,如果-然后的语句或开关-用例语句,特别是当那些if-然后的语句需要大量的设置代码才能正确运行。我感觉自己开始失去我想要完成的任务的逻辑,而代码开始感到脆弱。在这一点上,这通常表明是时候将代码重构为具有特定实现的基类了。

切换到面向对象样式(而不是函数式)的一个重要部分是将if-然后语句转换为“运行此操作”语句。您只需要告诉代码运行它的操作,而不是一组庞大的if--然后语句。实际运行的操作取决于您提供的实现。

例如,下面是C#样式伪代码中的函数样式:

代码语言:javascript
运行
复制
if ( action == "email" ) { 
    callEmailFunction(userInfo);
}
else if ( action == "sms" ) { 
    callSmsFunction(userInfo);
}
else if ( action == "web" ) { 
    endpoint = "http://127.0.0.1/confirm";
    confirmWeb(endpoint, userinfo);
} 
...

但也许你可以把它改写成这样:

代码语言:javascript
运行
复制
interface IConfirmable {
    void Confirm(UserInfo userinfo);
}

public class ConfirmEmail : IConfirmable { 
    public void Confirm(UserInfo userinfo) {
        // do the appropriate thing to confirm via email
    }
}

public class ConfirmSms : IConfirmable { 
    public void Confirm(UserInfo userinfo) {
        // do the appropriate thing to confirm via email
    }
}

public class ConfirmWeb : IConfirmable { 
    // this is a constructor
    public ConfirmWeb(string endpoint) { 
        ...
    }

    public void Confirm(UserInfo userinfo) {
        // do the appropriate thing to confirm via web
    }
} 

然后守则本身:

代码语言:javascript
运行
复制
// An implementation that decides which implementation of the base class to use
// This replaces the if-then statements in the functional programmming.
IConfirmable confirmer = ConfirmerFactory.GetConfirmer();

// get the userinfo however you get it, 
// which would be the same way you get it in the functional example.
UserInfo userinfo = ...;

// perform the action.
confirmer.Confirm(userinfo);

现在,当if-然后有非常少的代码时,这看起来是一项很大的工作,却得不到任何好处。如果代码中只有很少的代码,这是正确的:对于代码来说,这是一项很难理解的工作。

但是,当您有不止一个操作时,面向对象的风格才会发光,而不仅仅是需要执行的Confirm()方法。也许您有一个初始化例程、三个或多个可以运行的操作方法以及一个Cleanup()方法。基本算法是相同的,只不过它对实现公共基类的适当对象进行调用。现在,您开始看到面向对象风格的一个真正好处:基本算法比在每一步都检查if -然后语句要容易得多。

票数 10
EN

Software Engineering用户

发布于 2014-12-23 08:46:44

是的,如果您的项目范围是众所周知的或者是有限的,那么使用旧的样式代码是完全正常的。如果您计划扩展您的程序或项目OOP是一种方法,因为您可以无缝地维护和扩展您的代码,另一方面,如果您计划了它并得出结论,您永远不会计划您所做的项目的可扩展性,那么编写没有OOP的代码就足够了。这并不意味着如果您使用非面向对象的方法,您永远无法升级您的项目,但那将是一个乏味的事情做。OOP是帮助我们将我们的概念形象化,就像它是一个真实的有机体一样,因为我们比其他任何事物都更了解它们。

票数 3
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/267170

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档