我正在完成我的硕士学位(计算机)并申请工作。我注意到许多公司专门要求了解面向对象。流行的访谈问题涉及继承,多态性,访问器等。
OO真的那么重要吗?我什至接受了C语言编程工作的面试,面试的一半是面向对象的。
在现实世界中,开发实际应用程序时,几乎总是使用面向对象吗?诸如多态性之类的关键功能是否大量使用?
我认为我的问题来自我的弱点之一。尽管我了解OO,但是似乎无法将其大量集成到我的程序中。
我正在完成我的硕士学位(计算机)并申请工作。我注意到许多公司专门要求了解面向对象。流行的访谈问题涉及继承,多态性,访问器等。
OO真的那么重要吗?我什至接受了C语言编程工作的面试,面试的一半是面向对象的。
在现实世界中,开发实际应用程序时,几乎总是使用面向对象吗?诸如多态性之类的关键功能是否大量使用?
我认为我的问题来自我的弱点之一。尽管我了解OO,但是似乎无法将其大量集成到我的程序中。
Answers:
OOP是一种范式,它使您的程序得以扩展而又不会变得无法维护/理解。这一点是学生几乎一无所获的,因为他们所做的小项目最多持续两个星期到两个月。
这短暂的时间不足以使OOP的目标明确,特别是如果项目中的人是初学者。但是坚持一些建模对于大型项目至关重要,我要说的是> 50,000行代码。OOP不是解决此问题的唯一方法,但这是业界使用最广泛的方法。
这就是为什么人们希望您了解OOP的原因。
出于经验,我要补充一点,几乎所有初级程序员在建模和OOP方面都存在严重缺陷。他们中的大多数人都知道如何编写类,从中继承类以及诸如此类的基本知识,但是他们不认为“ OOP”会导致滥用。这就是为什么任何认真的招聘人员都将始终看待您在OOP领域中的能力的原因。
由于这些事情不是在学校学习的,因此不同候选人之间的知识差异非常大。坦白地说:我不认为拥有OOP知识的人可以在任何大型项目中工作,仅仅是因为首席开发人员管理这些人员需要更多时间,而不是自己编写代码。
如果您还不认为“ OOP”,我建议您阅读一些有关它的书籍,并在没有真正大项目的公司中申请;习惯OOP继续为您的雇主做有用的工作(只要他/她给您您的薪水,这对您也将是有用的)。
编辑:哈,我还要补充一点,我已经用C编写了OOP代码,即使它不是C的最常用用法,也可以借助很广的知识来实现。您只需要手动构建vtable。
在OOP技术背后,隐藏着一些东西:软件设计。与其他任何语言一样,软件设计对C语言确实很有帮助。许多招聘人员将测试您的软件设计能力,OOP问题对此很有帮助,但是OOP并不是这里要测试的主要内容。这就是为什么即使对于C职位也有这些问题的原因。
struct
并在C中使用可在该结构上运行的函数。
计算机编程的一个压倒性问题是处理复杂性,现代程序的确确实可能非常复杂,而且这种情况似乎只会增加。
非平凡的计算机程序的软件工程中所做的许多工作都集中在驯服复杂性上,并使其尽可能多地可访问,而无需首先投入学习的生命。
例子:
换句话说,如果您想单独或(很可能)与他人一起开发非平凡的软件,则需要掌握许多技巧。
是的,主要是因为也许用于商业开发的两个最受欢迎的开发平台(Java和.NET)是面向对象的,这意味着是的,OO的使用非常广泛(包括多态性,继承和其他所有功能)。
公司并不特别关注面向对象的技术-这不是意识形态的东西,他们关心的是能够以符合IT战略的方式开发问题解决方案的人员。
但是我不会太担心这个缺点。在不尊重您的学历的情况下,商业世界中的大多数人不会看到程序员(无论任何级别)都从大学毕业。您还有很多东西需要学习,而且可以理解(公司可能比学生更好)。
与现实生活中一样,现实生活编程与理论上有所不同。
是的,如果保持OO范式完善,并且始终在您的脑海中,那么您可以更好地编写可管理,可理解且易于扩展的代码。
不幸的是,现实世界有:
在实际工作中,您必须处理上述问题。这听起来令人沮丧。但是,请将其视为警告。招聘公司在招聘时过于重视OO。很容易明白为什么。他们测试候选人的唯一方法是询问对OO的理解。不幸的是,许多候选人只是在回答面试前就回答了这些问题。
现实中的OO速度很慢。如果您继续阅读并不断改进它会有所帮助。
完成学士学位后,我有完全相同的感觉,而一本很棒的书向我展示了OOP为什么以及如何与现实世界中的应用相关:Head First:设计模式。我真诚地建议您看一看,它以一种非常有趣的方式编写,并提出了许多有效的观点,说明了在使用规模较大且不断变化的系统时为什么需要使用OOP方法。
我必须对OO是一切的这一观点表示不同意见-可以说OO允许您构建城市,但是程序程序是障碍。
以类推的形式给出我的回答,将军需要对象,士兵需要程序。一旦在OO中深入研究,就可以找到过程,如果那是您的专业知识并且您足够好,就不用担心OO,因为有人编写此OO象棋游戏代码非常容易:
-findBestMove
-makeBestMove
-waitForPlayerInput
但随后有人必须编写-findBestMove背后的代码,并且可以确保它不仅是这样:
foreach $move (@moves){
$bestMove = ($move > $bestMove ? $move : $bestMove)
}
return $bestMove
另一方面,如果您不知道如何阅读OO代码,请担心。因为您可以(几乎)确定您的代码将被某种对象弄乱。除非您使用的是我目前维护的12000个全局var和1200行“模块”的fortran传统庞然大物。
乔恩·霍普金斯写道:
是的,主要是因为也许用于商业开发的两个最受欢迎的开发平台(Java和.NET)是面向对象的,这意味着是的,OO的使用非常广泛(包括多态性,继承和其他所有功能)。
这几乎是我要说的,但不仅仅是Java和.Net,C ++到处都是,Objective-C遍及OSX,所有很酷的孩子在做Ruby或Python,所有这些以及许多其他东西更多的重点放在面向对象。许多新的语言都是多范式的,因此F#之类的东西主要是一种功能语言,但也支持面向对象。它无处不在,至少有一些了解非常有用。不过不要太担心,刚完成大学课程就意味着您已经准备好开始学习在现实世界中开发代码了:)
我已经进行了很长时间的编程,并且我发现OO的概念即使在C语言中进行编程时也很有用-即使经过测试,我也可能无法在每个微小的细节中描述这些概念。有时候,我什至创建了一种OO语言,尽管是最基本的一种语言,但我还是想着这个概念,并从一个新的角度寻找OO中的乐趣。
顺便说一句,C ++使得OO变得一团糟,而Objective C做到了。
关于采访,从桌子两边看,它们已经成为恐怖节目。大多数受访者对他们感到非常震惊。大多数招聘经理都对甚至没有通过基本的编程测试而失败的人数感到惊讶。
就是说,目前在软件行业中有一些巨大的冲洗袋,他们一无所知,但对潜在员工的期望却很高。
学习OOP不如学习软件开发有用。去阅读Code Complete 2。
当然这是一个非常有用的工具,但OOP本身是真的很小。通常,当公司和招聘人员说“ OOP”时,它们的意思是“软件开发”。它被用作通用术语。
真正的招聘人员会告诉您知道如何开发软件与匹配“在OOP中已有3年”复选框的区别。
正如其他几个人指出的那样,答案是肯定的。
但是,如果您要处理大量非OO程序的意大利面条代码,也可以在那里找到。我认为您将更喜欢OO工作。
编辑:原谅我关于枪手的犬儒主义和幽默感的案例。正如Raynos所说,仅仅因为OO并不意味着它是好的。OO的正确应用需要实际的工作和思考;仅拥有它的实例并不能自动意味着一个应用程序制作精良。相反,我确信那里有编写良好的程序代码。我在90年代和2000年代的企业IT商店中的经验是,编写了很多不良代码,并且可能仍然存在。但是更接近OP的问题,我注意到,有机会的时候,更聪明的开发人员正在转向更多的OO系统。
OO是构建其他技术的基础。关键是首先要完全了解类型(类)和该类型的实例之间的区别。不要在没有完全理解的情况下继续阅读(以后会明白这一点),因为一旦您了解了愿景,您将不得不重新阅读其余内容。
一旦掌握了它,就永远不会想要没有它。在封装,模式,框架或其他方面,我不是一个纯粹主义者。在工作中,您必须适应各种视图和概念。我将列出一些我自己以前的工作经验:
在一家公司中,我的同龄人希望尽可能多地延迟加载(空构造函数,笨重的属性,这些属性必须在所有地方检查空值)。他们正在构建寿命短的基于Web的服务器端对象。
下一份工作完全相反。对象驻留在桌面(基于Excel)的应用程序中。尽可能多的初始化应该在构造函数中(或许多构造函数重载之一)。空的构造函数是不允许的,因为空的对象没有生存权(这使持久性成为一个挑战)。另外,我不得不适应他们的“编码样式标准”(在其中打开括号,在注释后添加空格等),因为如果没有通过样式警察,则无法检入我的代码。
目前,我在一家公司中工作,那里的开发人员都从未尝试了解OO。很难表达出这种情况多么令人沮丧。我必须提高我的Grep技能,实际上,我已经为我的F12键分配了HotScripts宏,以便对所选文本进行grep。我会避免其他挫败感...
一旦您获得了面向对象的技能,您几乎会对意大利面过敏!但是,在所有情况下,无论是否为OO,都要耐心并适应。不愿“扔掉并重新开始”。当您抛出问题时,老板会宁愿选择您。不幸的是,“赚钱”比优雅的代码更重要。
抱歉,答案很长,但我尝试涵盖您问题的大部分范围:-)
OOP并不重要,因为它本身,而是因为它需要什么。涉及抽象和隔离能力的事物,将事物组合在一起最终只暴露了需要一起交互的部分。
这是一种称为“模块化”的通用工程技术,它允许将复杂的系统创建为较简单的系统的集合,而无需在较高层次上关注每个细节,并且即使组件不能完全相同,也要求它们是可替换的。相同。
从软件产品本身变得比“单一开发人员功能”更大的时间开始,就尝试将这些“工程概念”保留在软件开发中,因此需要一种方法来使开发人员在独立的部分上工作,并让这些部分一起互动。
也就是说,这些原理不一定仅在OOP中找到(它的计算理论是有效的,得出这些结果的方法是无限的)。
OOP是简单的一次成功尝试把这些东西放在一起,让那些一般条款(如模块,封装,替换)更精确的定义和精心构思的这些定义(模式),能够适应编程语言。
首先,对OOP而言,不是将其视为“ 语言功能 ”,而是将其视为使软件工程师着手进行软件设计的“ 通用词典 ”。
给定语言是否具有直接执行该词典的原语,以确保(例如)不由不应该这样做的人无意中打开“胶囊”这一事实是OOP设计的第二个方面。这就是为什么即使大型C项目也经常作为OOP“管理”的原因,即使语言本身没有对此提供直接支持。
直到项目规模成为单一开发人员了解和跟踪他所做的事情的能力(事实上,在那种情况下,它甚至可能被视为“开销”)或由一小群人在开发中进行开发,才能认识到所有这些优势。短时间。这就是大三学生根据“语言功能”研究OOP的主要原因,常常会误解它,从而产生错误的设计代码。
OOP如何适应语言取决于语言设计者如何在自己的构造中解释OOP原理。
因此,C ++中的“封装”成为“私有成员”(“胶囊”成为类),“替代”成为虚函数的重写或模板参数化/专业化等,而在D中,胶囊是“模块”(并且替换通过类等),从而使某些范例或模式可以直接在给定语言中使用,而不能在另一种语言中使用,依此类推。
招聘人员在提出OOP问题时寻求的只是检查您抽象和构思未来大型项目和开发的软件设计的能力。OOP,因为他们只是他们和您都知道的“字典”,所以您可以谈论其他更一般的事情或具体化为特定的实现。
面向对象的语言可以帮助您在代码中保留面向对象的设计,这很好。但是,也可以使用任何其他范式语言来获得这种设计,这也是事实:OO语言(尤其是在公司中)流行的原因很可能是Java和c#在商业上的成功。
如果盖茨先生以正确的方式创立他的公司,我们可能会在申请工作之前先学习SCHEME。
简短的回答是
较长的版本,为什么您感到困惑或为何感到困惑,这仅是因为您尚未从事任何可达到某些目的的项目或实现的事实。它在教室中完全有效,可以在汽车上有示例,然后扩展到汽车,卡车...,但是当您跳入软件开发时,它的解决方案旨在简化某些任务。现在,如果不是这样,OO
我们将让每个人都在代码库中编写类似的代码,或者每天重新发明轮子。想象一下,如果深入研究这样的代码库来修复某些问题,那将会是多么混乱。课堂上的例子是模糊的定义或表示方式/原因。当您开始构建应用程序时,真正的测试已经结束,毫无疑问,它可能会被广泛使用,但由于其简洁明了的使用方式,它远远无法衡量其合理性。因此,最好在这些薄弱的地方开始工作,除非您制作出噩梦代码。
这取决于。您需要了解OO的原因之一,因为它是编程领域的通用语言。另一个答案指出,几乎每种主要语言在某种程度上都是面向对象的,这意味着基本上任何可能雇用您的公司都在使用面向对象的语言。是否曾经尝试雇用OCaml程序员?不可能; 人才库太小。如果您使用OCaml成立了公司,并且公司成功了,那么您将无法足够快地聘请程序员,这将使您倒闭。因此,几乎每个拥有超过3个程序员的公司都使用OO语言,并且为了与您的同事进行交流并使用平台的库,您需要了解OO。
根据公司所使用的特定语言,继承和多态性要么非常重要,要么只是适度相关。如果不使用10种GoF设计模式和一个依赖项注入框架,您将无法在Java中做任何事情。Java是使用最广泛的语言之一,因此面向对象原则对于许多使用Java的公司来说确实很重要。
如果公司正在使用具有lambda和函数指针的现代混合OO /功能语言(例如Scala或C#),那么继承突然变得不那么重要了,因为您具有更高阶的函数来处理很多非常简单的事情,否则它们将需要很多仪式。但是,您仍然需要能够使用OO东西,因为您使用的大多数库都是以OO方式编写的。
如果继承和多态是不是重要的公司,你还是有可能得到OO问题,因为: