有人问我,开始教C#和面向对象的概念一组程序的程序员。 我搜索了思路上从哪里开始,但是在寻找的主题普遍的共识与除主题最初避免导致。
编辑
我打算在30分钟分期呈现信息周刊,直到它不再有意义见面。 这些演讲是在他的同事在不同的技能水平,从新手到专家的目标。
有人问我,开始教C#和面向对象的概念一组程序的程序员。 我搜索了思路上从哪里开始,但是在寻找的主题普遍的共识与除主题最初避免导致。
编辑
我打算在30分钟分期呈现信息周刊,直到它不再有意义见面。 这些演讲是在他的同事在不同的技能水平,从新手到专家的目标。
你能做的最好的事情是: 有一吨的 Q&A的 。
维基百科的过程编程 (PP)文章真的打,你应该开始:
而程序编程使用程序,以对数据结构进行操作,面向对象的编程捆绑两个在一起,使一个“对象”在其“自己”的数据结构进行操作。
一旦这一技术被理解,我想了很多将水到渠成。
一般来说
OOP是可以花时间的事情之一“获得,”每个人需要自己的路到那里。 当在C#编写,它不像代码尖叫,“ 我使用OO原理!”在每一行。 它更多的是微妙的东西,像一个foreach
循环,或string
串联。
设计中心
始终使用 使得它之前的东西(反复)。
首先, 使用一个对象,并显示从PP的基本差异。 喜欢:
static void Main(string[] args)
{
List<int> myList = new List<int>();
myList.Add(1);
myList.Add(7);
myList.Add(5);
myList.Sort();
for (int i = 0; i < myList.Count; i++)
{
Console.WriteLine(myList[i]);
}
}
使用对象(和其他OO东西)第一-之前被迫创建他们自己的-让人下来,“好吧,我在做什么像什么,我只是用”,而不是“WTF上午我打字的路径? “
继承(这是一个陷阱!)
我不会花很多时间在继承。 我认为这是一个常见的错误的经验教训,使一个大问题关于这个(通常制作一个老生常谈的动物层次,正如其他人指出的)。 我认为这是关键了解继承,了解如何使用 .NET框架,但它的细微差别都不是什么大不了的事。
当我使用.NET,我更容易“碰上继承”当我使用 .NET Framework(即“这种控制有Content
的财产?”或者“我只是调用它ToString()
方法。“),而不是当我创造我自己的类。 很(非常(非常))很少这样做我觉得有必要做一些模仿动物王国的分类结构。
接口
编码到一个接口是一个关键的中级概念。 它的使用无处不在,OOP使得它更容易。 这方面的例子是无限的。 构建在I具有上述的例子中,人们可以证明IComparer<int>
接口:
public int Compare(int x, int y)
{
return y.CompareTo(x);
}
然后,用它来更改列表的排序顺序,通过myList.Sort(this)
。 (后说起this
,当然。)
最佳实践
因为有一些有经验的开发人员在一组,在中级班一个策略是展现最佳实践在C#中如何将各种工作。 就像,信息隐藏,在观察者模式 ,等等。
有一吨的Q&A的
同样,每个人都学会略有不同。 我认为你能做的最好的事情是有一吨的Q&A,并鼓励其他组中有讨论。 人们普遍了解更多信息时,他们参与其中,和你有一个很好的情况下,应该是比较容易。
从程序上的飞跃,是面向对象的(即使是在一门语言 - 四个月我编程程序C ++和类是不舒服了一会后)可以得到缓解,如果你强调的是,人们不强调更多的基本概念。
例如,当我第一次知道OOP,这些书强调,每个对象都有自己的一套数据成员。 我试图写类输入验证之类的,不理解的类是对数据成员,而不是输入操作。
获取与数据结构马上开始。 它们使OOP范式似乎是有用的。 人教你如何做一个“家”类,但由于大多数初级程序员想要做一些有用的东西向右走,这似乎是一个无用的弯路。
避免多态的时候了。 继承是好的,但教,在适当时候(而不是只添加到您的基类)。
当你第一次学习和特殊构建函数(默认情况下,析构函数,复制构造函数和赋值运算符都有其棘手的问题,你可能想避免,直到他们在基础类设计接地)运算符重载不是必需的。
让他们建立一个堆栈或链接列表。 不要做任何事,其中穿越是棘手的,像一个二叉树。
这样做在阶段。
高层次的概念:描述一个物体是什么,它涉及到现实生活中。
中等层次的概念:现在他们得到了什么对象,尝试比较和对比。 告诉他们为什么相比于一类的封装值的全局变量是坏的。 他们可能会从封装什么好处。 开始引入了面向对象的tennets(封装,继承)
低层次的概念:走得更远到多态性和抽象。 向他们展示如何通过多态和抽象获得更好的设计。
高级概念:坚固,接口编程,面向对象的设计模式。
也许你应该考虑的一个问题是工作相关的,并用程序实现它的启动,然后通过(会议通过会议)的工作方式,使这一个面向对象的实现。 我找专业人员往往掌握概念更好,如果它是直接从自己的工作地点与实际的例子。 因为他们离开的学生想知道,为什么地球上我会永远要做到这一点,垃圾的例子很多教科书使用往往是可怕的理解。 给他们现实生活中的原因,他们希望做到这一点,它更有意义。
我将避免“自行车是一种veichle”的方针,并尝试运用OO到是相当具体的,他们已经习惯了的环境。 尝试找到的,他们都承认的问题域。
锻炼; Tibial在该领域的基础知识,而是尝试对某些移动“哇!” 或“啊哈!” 经验比较早; 我曾在福勒这样的体验,同时阅读“ 替换条件与多态性 ” 重构 ,这或类似的书籍可能是思想的良好来源。 如果我没有记错,迈克尔羽毛与遗留代码有效地工作包含有关如何将一个程序的程序进入OO章。
教重构
教基本的原则OO最低限度,然后教重构动手。
传统的方式:抽象>行话云>简单的实现>实际运用 (?你可以在这里发现了断开一个这些转变的是比别人更努力。)
在我的经验,最传统的教育不应该在获得程序员真正神交OO原则做好。 相反,他们学习了一下语法,一些行话,他们有一个模糊的认识,和几个典型的设计实例作为很多他们做什么模板。 这是从某种OO设计和工程人会希望主管学生获得的透彻理解光年。 其结果往往是代码被分解成大块在什么可能被描述为对象库,代码名义上附加到对象和类,但是是非常,非常远不够理想。 这是非常常见的,例如,看到几百行的方法,这是不是很OO的。
提供对比度要更加重视OO的价值
教给学生,给他们工具,在锋线上改善现有代码的面向对象设计,通过重构。 采取的程序代码大大片,使用提取方法一堆使用有意义的方法名称倍,确定共享共性和端口了他们对自己的类方法组。 开关/例多态性进行更换。 等等这样做的好处是很多的。 它使阅读并与现有的代码,关键技能工作的学生的经验。 它给出了OO设计的细节和优点更透彻的了解。 这是很难体会到在真空中特定的面向对象设计模式的优点,但它比作多个程序的风格或笨拙OO设计将形成鲜明对比的优点。
构建知识,通过心理模型和表现术语
重构帮助学生理解面向对象设计的语言和术语,如何通过思想判断OO设计和实施质量的代码味道。 它也为学生提供了哪些讨论与同行面向对象的概念框架。 如果没有模型和,比如说,汽车变速器的术语,机械将有困难的时候互相理解和沟通的汽车。 这同样适用于面向对象设计和软件工程。 重构提供了丰富的术语和心智模式(设计模式,代码味道和相应的青睐具体重构等)的组件和软件工程的技术。
建立手艺的伦理
通过教学生认为设计不是一成不变你加强学生对自己进行实验,学习和探索能力的信心设定。 得到他们的手脏,他们会觉得在解决软件工程问题赋予更多的权力。 这种信心和实用技巧将让他们真正拥有自己的设计工作(因为他们将永远拥有的技能和经验,改变设计,如果他们愿意的话)。 这种所有权希望能帮助培养责任感,自豪感和工艺感。
首先,选择如C#或Java语言,并拥有充足的样本来证明的。 始终向他们展示大画面或进入像抽象或封装面向对象的概念更精细的细节之前,大创意。 准备好回答了很多,为什么有足够的现实世界的例子问题。
我有点惊讶有任何纯粹的程序的程序员离开;-)
但是,谁的人开始对程序语言如COBOL,C和Fortran 80年代初编码回来,记得我曾经最困难的用的东西是实例。 物体本身的概念是不是很难,因为基本上他们是“结构与连接方法”(从程序的角度看),但如何处理,当我实例化一个对象 - 在没有垃圾收集那些日子 - 销毁了它们引起的我有些麻烦。
我认为,出现这种情况是因为在某些意义上的程序的程序员通常可以指向任何变量在他的代码中的任何说这就是数据的项目被直接存储,而只要你实例化一个对象,并赋值给那么它直接要少得多有形的(使用指针和内存分配在C是当然类似,这可能是一个有用的出发点也是,如果你的学生有ç经验)。 从本质上讲,我想这意味着你的程序 - > OOPS程序员必须学会处理他们的代码抽象的另一个层面,而且越来越习惯这种心理一步是比看起来更困难。 推而广之我因此请确保您的学生与分配,看着这样可能造成混淆的概念,静态方法之前处理的对象十分舒适。
我建议考虑看看Head First设计模式 ,其具有非常好的,易于理解面向对象的设计应该真正帮助的例子。 我不会强调“模式”方面太多,在这一点上,虽然。
我是一个vb.net中级程序员,我正在学OOP。 其中一个我发现的一件事是在讲课时的概念,工作在令人不安。 我认为这将是完美的文档会,而不是试图强迫他们理解概念,然后让他们写使用所有的概念完全面向对象的代码程序编程完全成熟的面向对象编程的逐渐过渡。 这样,他们可以不设计的恐吓小项目,如“世界你好”补锅匠。
例如(这是VB.NET初学者没有先进的程序设计者)。
我认为第一章应始终对一般概念,只有几个例子,但你不应该强迫他们严格的OOP代码向右走,让他们习惯的语言,所以很自然他们。 当我第一次开始,我不得不回去,一遍又一遍地阅读说明书记住如何写代码,但是我不得不通过网页和演讲有关概念的页面涉水。 痛苦! 我只需要记住如何创建一个只读属性,什么的。 什么是真正的方便是书上说的是一种语言的参考,所以你可以很容易地看在那里找到了如何编写代码的部分。
然后,请您简要解释如何形式,所有的对象都已经对象,有方法,并展示他们的言行举止,和示例代码。
然后告诉他们如何创建一个类,并让他们创建一个类,有属性和方法,以及新的结构。 然后让他们基本上在形式或模块使用的程序代码从他们切换,写入方法的类。
然后你只引进更先进的代码,就像任何编程语言。 告诉他们如何继承工程等就不断扩大,然后让他们使用thier创造力去发现什么可以做。
他们习惯了编写和使用类之后,然后介绍如何thier类可以改善,引入的概念一个接一个代码,修改现有的项目,使他们更好。 一个好主意是采取程序代码的示例项目,并将其转换成OOP他们展示OOP的所有限制了较好的应用。
现在,经过那就是先进的部分,你遇到了一些很先进的面向对象的概念,使人们谁是familar与OOP已经得到一些价值出书。
首先定义一个对象,而不是使用一些愚蠢的动物,形状,车辆的例子,但与一些他们已经知道了。 在C STDIO库和FILE
结构。 它用作与定义的函数的不透明数据结构。 地图,再从程序使用一个面向对象的用途和去从那里到封装,多态等。
如果他们是好程序的程序员和知道什么是结构和指向函数的指针是,这份工作最困难的部分已经完成!
我想想怎么面向对象编程可以在程序语言,甚至汇编实现低水平的演讲,可能是凉爽。 然后,他们将明白,编译器会为他们的工作量; 也许他们会发现他们已经知道和以前使用的编码模式。
然后,您可以在良好的面向对象设计谈论的最佳实践,并介绍了一下UML的。
而且要记住很重要的事情总是他们不是新生,不要花太多的时间与基本的东西,因为他们会觉得无聊。
显示在实例设计模式
那里有很多的一些很好的答案,好吧。 我也觉得,你应该用良好的语言,好,技术过硬的例子,但我有一个额外的建议:
我所学到的OOP方式,通过学习设计模式。 当然,我当然学过面向对象的语言,但直到我工作的设计模式,我不明白这一切的动力。
我也是从OO-大师像罗伯特C.马丁和他的真正伟大的论文学到了很多东西(要在他的公司网站上发现)。
编辑:我也主张教学OO /设计模式使用UML(类图)。
使得它点击我的事情是引入重构和单元测试。 我的大部分职业生涯规划已经在面向对象的语言,但我把大部分钱都花在编写程序代码。 你叫的类X的一个实例的功能,并呼吁Y.类的一个实例,我没有看到什么接口大不了是一个不同的方法,并认为遗产只是一个方便的概念,和类通过和大的帮助我们梳理和分类大量的代码的方式。 如果一个人已经足够自虐,他们可以很容易地通过一些我的老项目和内联的一切,直到你得到一个大规模的集体。 我仍然在我的代码是多么糟糕敏锐地尴尬,多么幼稚我的建筑了。
这半按下时,我们通过Martin Fowler的重构书去,然后在开始经历和编写单元和FitNesse的测试,我们的代码,迫使我们完全重构点击。 开始推重构,依赖注入,和代码的分离成不同的MVC模式。 要么它会下沉,或他们的头会爆炸。
如果有人真的不明白,也许他们不会削减了对OO工作,但我不认为我们的球队没有人得到完全丧失,所以希望你有同样的运气。
我是一个面向对象的开发专业,但在我的开发团队已经有过程序开发者(他们正在开发的Matlab代码,所以它的工作)。 其中之一,我在面向对象编程喜欢的概念是对象可以如何与您的域名( http://en.wikipedia.org/wiki/Domain-driven_design - Eric Evans的写了一本关于这一点,但它不是一个初学者的书通过任何拉伸)。
随着中说,我会展示在较高的水平面向对象的概念开始。 尽量让他们设计汽车的例子。 大多数人会说有车有一个车身,发动机,轮毂等解释如何将这些能与现实世界中的物体。
一旦他们似乎掌握高层次的概念,然后我就开始在它和如继承VS聚集性,多态性等概念的实际代码的一部分
我在我的中学后教育过程中了解OOP。 他们做解释的概念的一个相当不错的工作,但在解释为何以及何时彻底失败。 他们的方式他们教OOP是绝对一切必须是一个对象,过程式编程是邪恶出于某种原因。 他们给我们的例子似乎矫枉过正对我来说,部分原因是对象似乎并不像正确的解决每一个问题,部分是因为它看起来像很多不必要的开销。 这让我鄙视OOP。
自那时以来这些年来,我已经长大了喜欢的情况OOP的地方对我来说很有意义。 我能想到的最好的例子是最近的web应用程序我写的。 最初,它跑了它自己的一个单独的数据库,但在开发过程中,我决定把它挂到另一个数据库导入有关新用户的信息,这样我可以让应用程序设置它们自动(输入员工ID,检索姓名和部门) 。 每个数据库具有该检索的数据功能的集合,他们依靠一个数据库连接。 另外,我希望有一个明显的区别,其数据库的功能属于。 对我来说,这是有意义的为每个数据库中的对象。 施工人员没有建立连接的前期工作。
在每个对象,事情相当多的程序。 例如,每个类有一个叫做getEmployeeName()函数返回字符串。 在这一点上,我不认为有必要建立一个Employee对象,并检索名称的属性。 如果我需要检索有关雇员数块数据的对象可能会更有意义,但对于东西少量我需要它似乎并不值得。
成本。 解释如何正确的使用语言的特征应允许软件编写和维护的成本更低。 (例如Java的Foo.getBar(),而不是foo->栏,以便经常出现在C / C ++代码)。
否则,为什么这样做呢?
我发现这本书概念,技术和计算机编程的模型对理解和给我一个词汇,讨论语言范式的差异非常有帮助。 这本书并没有真正涵盖Java或C#作为00国语言,而是不同范式的概念。 如果我教OO我将通过展示在范式上的差异,然后慢慢地在00国语言本身的差异,他们可以皮卡实用的东东做课程/项目启动。
当我从程序转移到面向对象的,我做的第一件事是让静态范围熟悉。
Java是一种良好的语言开始,因为它试图忠实于各种不同的OO范式做OO。
一个程序的程序员会看的东西像程序进入和退出点,一旦他们可以概念化上暴殄天物类的静态范围是最熟悉不过的事情对他们来说,知识就会从那里开花了。
我记得那一刻的灯泡相当生动。 帮助他们了解关键术语的抽象,例如,静态方法,你可能要去给他们更好地学习前进的工具。