我很难让我的团队熟悉基于界面的编程......任何人都有一些建议吗?
答案 0 :(得分:13)
为了帮助您的团队熟悉这个想法,最好的方法是展示基于界面的开发可以实现什么,并将其与没有它的同样的事情进行对比。为了让他们“真正”接受并开始理解它们,他们首先需要理解并感受到它所解决的问题的痛苦。他们真的需要有“我厌倦了每次Y发生时必须做X”与自己或团队的对话。在我的“形成”岁月里,父亲钻进我的一件事就是这个小宝石:
无论多少次 告诉你,你永远不会有 回答,直到你问这个问题。
一旦这种对话发生(由个人或团队自行发起),这就是真正的学习可以发生的地方。诀窍是培养一种能够刺激这类问题的环境。如果你能告诉他们他们想要解决接口所解决的问题,那么他们就会自问这个问题。
一个证明接口有用性的好例子如下:
你被指派成为国际数学大会的保镖。你被告知只是让那些人能够正确回答“什么是两加二”的问题。由于这是一项国际活动,自然会有许多人试图进入,说许多不同的语言。首先,你的策略是弄清楚(或猜测)请求入口的人说什么语言,然后找一个说同样的翻译并通过他提问。事实证明,这很有效,很快你就会学会快速识别某些语言,现在知道哪些口译员会说这种语言,但是如果有人会说一种你无法识别出来的语言,那么肯定会很痛苦。必须花费所有时间来弄清楚它是什么,然后找到合适的口译员。所以,知道必须有更好的方法,你试着找出一种改进的方法来完成你的工作,那就是你需要的时候。你会得到一大堆纸和一些标记笔,每次有人参加大会时,你都会在一张纸上写下以下内容:
2 + 2 =
瞧,它有效!每个人都快速提供答案。您不必弄清楚该人说的语言或找到翻译。哎呀,你甚至不关心他们说的是什么语言,他们只是回答这个问题,因为他们都懂数学!您没有单独计算每个案例,而是使用了“IKnowMath”界面,每个参加数学会议的人都能理解。
答案 1 :(得分:11)
An Interface is a Contract。它只是指定Class的特定类别(很难理解这里的单词 class )应该作为公共API提供。
答案 2 :(得分:6)
界面就像是班级的着装要求。如果一个类实现了一个接口,那么它的公共成员(它对其他类的外观,如果你愿意的话)将包含接口所声明的内容。
答案 3 :(得分:3)
我建议你向他们展示可以从中获得的好处。想象一下这个C#场景:
class User
{
public String GetFirstName() { return "foo"; }
}
class App
{
void Run()
{
User user = new User();
String firstName = user.GetFirstName();
}
}
这里我们有一个User
类,它将从某个地方获取名字并返回它。现在你的应用程序与这个类相关联,以后很难改变你从哪里得到名字,因为你到处都使用了User
类。如果您实现了一项服务并希望开始为FirstName
值调用该服务,会发生什么?你可能需要进行一些重构。
考虑这种方法:
interface IUser
{
String GetFirstName();
}
class User : IUser
{
public String GetFirstName() { return "foo"; }
}
static class UserFactory
{
public static IUser GetUser() { return new User(); }
}
class App
{
void Run()
{
IUser user = UserFactory.GetUser();
String firstName = user.GetFirstName();
}
}
现在,您可以在所需的任何类中实现该接口:
class UserService : IUser
{
public String GetFirstName() { return "bar"; }
}
只需更改工厂方法,如:
static class UserFactory
{
public static IUser GetUser() { return new UserService(); }
}
并且您的应用代码将更加明智。
答案 4 :(得分:2)
他们熟悉哪些 ?
当我学习C ++时,老师建立在我对C的现有知识的基础上,例如:
在此基础上,我可以将IFile接口与File类进行比较,说IFile根本没有公开任何实现细节:如果应用程序使用IFile而不是File,那么您可以更改底层文件系统/实现细节)。
答案 5 :(得分:2)
在我们公司教授新的初级员工时,我成功使用的另一种方法是将界面视为“一种观察对象的方式”,字面意思。
模拟:拍摄3D物体,就像一块管子。根据您查看的方向,它看起来像(“表现为”)圆形,矩形或3D对象。然后,铸造的概念可以很容易地等同于“尝试旋转对象,以便您可以按照您想要/需要的方式进行调整”,这取决于您要查找的对象和视图是成功还是失败。
模拟不是真的100%,但它可以帮助制作一些非常抽象的东西,对于那些尚未将概念理解为具体事物的人来说。
答案 6 :(得分:2)
Head First设计模式的副本或至少来自Head first Design patterns的代码示例
故事讲述它在Head First Design Patterns中的表现方式实际上与怀疑论者一起工作很多次
问候 Edwards的
答案 7 :(得分:1)
告诉他们接口是一个特技词。因为意思隐藏在开放中:P
接口描述......一个接口。它们告诉您如何与实现它的类进行交互。
答案 8 :(得分:1)
我喜欢Legos的类比,它们是类和实例,分别是顶部/底部的钉/孔以及尺寸和形状,它们是接口。例如,我可能需要一个带有2x4网格中的钉子的矩形块。这些是我感兴趣的界面 - 挂钩的男/女界面,以及矩形界面。这些可以通过矩形块乐高的实例,或者由两个半尺寸乐高积木“组成”的每个实例来满足,每个乐高2x2弦,从而仍然粘附到所述界面。因为所有的乐高积木都有一个共同的界面(男性和女性的钉子),我们可以混合和组合,无论是必要的,无论是来自我可以建造一个巨大的机器人蚂蚁的那些新集合中的一个,或者只是一个普通的老方块或矩形。 lego来自你过去常常回来的巨型桶。地狱,我甚至可以将官方乐高积木与品牌X乐高混合,因为“男/女挂钩界面”是如此了解。
接口编程允许我们混合和匹配可重用的代码组件,就像我们做Legos一样。