Oop 你所说的“是什么意思?”;“编程到接口”;及;“从编程到实现”;?
在Oop 你所说的“是什么意思?”;“编程到接口”;及;“从编程到实现”;?,oop,design-patterns,Oop,Design Patterns,在Head-First设计模式一书中,作者经常说应该编程到接口而不是实现 这意味着什么?更关心的是类做什么,而不是它如何做。后者应该是一个实现细节,封装在类的客户端之外 如果您从一个接口开始,以后就可以自由地注入新的实现,而不会影响客户端。它们只使用接口类型的引用。更关心类做什么,而不是它如何做。后者应该是一个实现细节,封装在类的客户端之外 如果您从一个接口开始,以后就可以自由地注入新的实现,而不会影响客户端。它们只使用接口类型的引用。这意味着在使用类时,您应该只针对公共接口编程,而不应该假设它
Head-First设计模式
一书中,作者经常说应该编程到接口而不是实现
这意味着什么?更关心的是类做什么,而不是它如何做。后者应该是一个实现细节,封装在类的客户端之外
如果您从一个接口开始,以后就可以自由地注入新的实现,而不会影响客户端。它们只使用接口类型的引用。更关心类做什么,而不是它如何做。后者应该是一个实现细节,封装在类的客户端之外
如果您从一个接口开始,以后就可以自由地注入新的实现,而不会影响客户端。它们只使用接口类型的引用。这意味着在使用类时,您应该只针对公共接口编程,而不应该假设它是如何实现的,因为它可能会发生变化 通常这会转化为使用接口/抽象类作为变量类型,而不是具体的类型,从而允许在需要时交换实现
在.NET世界中,一个例子是使用
IEnumerable/IEnumerator
接口-这些接口允许您迭代集合,而不必担心集合是如何实现的。这意味着在使用类时,您应该只针对公共接口编程,而不应该假设它是如何实现的,因为它可能会改变
通常这会转化为使用接口/抽象类作为变量类型,而不是具体的类型,从而允许在需要时交换实现
在.NET世界中,一个例子是使用
IEnumerable/IEnumerator
接口-这些接口允许您迭代集合,而无需担心集合是如何实现的。让我们用以下代码来说明:
namespace ExperimentConsoleApp
{
class Program
{
static void Main()
{
ILogger loggerA = new DatabaseLogger();
ILogger loggerB = new FileLogger();
loggerA.Log("My message");
loggerB.Log("My message");
}
}
public interface ILogger
{
void Log(string message);
}
public class DatabaseLogger : ILogger
{
public void Log(string message)
{
// Log to database
}
}
public class FileLogger : ILogger
{
public void Log(string message)
{
// Log to File
}
}
}
假设您是记录器
开发人员,而应用程序开发人员需要您提供记录器
。你给应用程序开发人员你的ILogger
接口,你对他说他可以使用,但他不必担心实现细节
之后,您开始开发文件记录器
和数据库记录器
,并确保它们遵循您提供给应用程序开发人员的界面
应用程序开发人员现在是针对接口而不是实现进行开发的。他不知道也不关心这个类是如何实现的。他只知道界面。这可以减少代码中的耦合,并使您能够(例如通过配置文件)轻松切换到另一个实现。让我们用以下代码来说明:
namespace ExperimentConsoleApp
{
class Program
{
static void Main()
{
ILogger loggerA = new DatabaseLogger();
ILogger loggerB = new FileLogger();
loggerA.Log("My message");
loggerB.Log("My message");
}
}
public interface ILogger
{
void Log(string message);
}
public class DatabaseLogger : ILogger
{
public void Log(string message)
{
// Log to database
}
}
public class FileLogger : ILogger
{
public void Log(string message)
{
// Log to File
}
}
}
假设您是记录器
开发人员,而应用程序开发人员需要您提供记录器
。你给应用程序开发人员你的ILogger
接口,你对他说他可以使用,但他不必担心实现细节
之后,您开始开发文件记录器
和数据库记录器
,并确保它们遵循您提供给应用程序开发人员的界面
应用程序开发人员现在是针对接口而不是实现进行开发的。他不知道也不关心这个类是如何实现的。他只知道界面。这会减少代码中的耦合,并使您能够(例如通过配置文件)轻松切换到另一个实现。这就是耦合。低耦合是软件体系结构的一个非常重要的特性。你需要了解的依赖性越少越好 耦合可以通过为了交互/使用您的依赖关系而必须做出的假设的数量来衡量(在这里解释M Fowler)
因此,当使用更多泛型类型时,我们的耦合更加松散。例如,我们从集合的特定实现策略中分离出来:链表、双链表、数组、树等。或者从经典的OO学派中分离出来:“它的确切形状是什么:矩形、圆形、三角形”,当我们只想依赖一个形状时(在旧式OO中,我们在这里应用多态性)这一切都是关于耦合的。低耦合是软件体系结构的一个非常重要的特性。你需要了解的依赖性越少越好 耦合可以通过为了交互/使用您的依赖关系而必须做出的假设的数量来衡量(在这里解释M Fowler)
因此,当使用更多泛型类型时,我们的耦合更加松散。例如,我们从集合的特定实现策略中分离出来:链表、双链表、数组、树等,或者从经典的OO学派中分离出来:“它的确切形状是什么:矩形、圆形、三角形”,而我们只想依赖一个形状(在旧的OO学派中,我们在这里应用多态性)
更关心的是类做什么,而不是它是如何做的。
此语句可能适合用户。但是“开发者”应该从中得到什么呢?呃!您的意思是,我们首先应该设计接口,然后根据接口编写代码?确切地说,将编程接口看作是代码必须遵循的契约,而不是另一种方式。当您编写代码时,您应该规定某个模块的主要目的是什么,然后根据该目的构建一个接口,最后实现interface@DVD谢谢,我明白,这是有道理的。更关心的是类做什么,而不是它如何做。
这句话可能适合用户。但是“开发者”应该从中得到什么呢?呃!你的意思是我们应该先设计接口,然后根据接口编写代码吗