Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oop 你所说的“是什么意思?”;“编程到接口”;及;“从编程到实现”;?_Oop_Design Patterns - Fatal编程技术网

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谢谢,我明白,这是有道理的。
更关心的是类做什么,而不是它如何做。
这句话可能适合用户。但是“开发者”应该从中得到什么呢?呃!你的意思是我们应该先设计接口,然后根据接口编写代码吗