美文网首页
面向对象中接口的意义

面向对象中接口的意义

作者: 游泽渠 | 来源:发表于2016-10-08 20:11 被阅读0次

    前言

    1.这篇文章仅限于对php的面向对象进行说明,其他语言的情况不再考虑之列。
    2.本人学生,难免有不足之处,希望各位大神指出。


    正文

    当我们在刚开始学习php这门语言的面向对象时,我们难免会对接口感觉到很陌生,因为它仅仅可以用来实现,而看起来任何意义,它不像继承一样可以让我们的类增加许多新的方法和属性,比如下面这种代码

    Icalculate.php
    <?php
    interface Icalculate
    {
        public function add($value1, $value2);
        public function ave($value1, $value2);
    }```
    现在有一个类实现了它
    

    Calculate.php
    <?php
    include "Icalculate.php";
    class Calculate implements Icalculate
    {
    public function add($value1, $value2)
    {
    return $value1 + $value2;
    }

    public function ave($value1, $value2) 
    {
        return ($value1 + $value2) / 2;
    }
    

    }```
    很多萌新看到后会想,这种接口,要不要是一样的,为什么还要存在呢?确实,让我们去掉接口

    class Calculate 
    {
        public function add($value1, $value2) 
        {
            return $value1 + $value2;     
        }   
        
        public function ave($value1, $value2) 
        {
            return ($value1 + $value2) / 2;
        }
    }```
    这样的代码也是完全可以的,甚至说还减少了由于实现接口不当而造成程序语法错误的几率。但是真的接口就像上面的例子一样毫无用处吗?我可以很明确的说不是的,因为东西肯定是要有意义才会存在。
    ***
    ####用于合作
    我们不妨考虑一下这样的情况:小明和小红<b>合作</b>写一个程序,目的是要实现输入两个数,求出最后的和以及平均数。小明说他来写加法的类,而小红去写数据的获得和输出。考虑一下如果没有接口,小红可能会这样写
    

    index.php
    <?php
    include "Calculate.php";
    $v1 = $_POST['v1'];
    $v2 = $_POST['v2'];
    $Cal = new Calculate();
    echo $Cal->plus($v1, $v2).'
    ';
    echo $Cal->average($v1, $v2);

    而小明写的代码如同一开始举的例子那样,这两个文件放在一起,程序是不能执行的,错误会是这样
    

    Fatal error: Uncaught Error: Call to undefined method
    Calculate::plus() in /home/frog/PHPCode/index.php:6```
    原因大家都懂,Calculate这个类没有plus这个方法,虽然add和plus这两个单词都有加的意思,但是很显然小明却没有像小红想得那样命名方法,所以最后导致了错误。但是在有接口的情况下,只要小红正确的使用接口,错误就不会发生。


    可替换性

    接着上面的例子,如果将来哪一天,小明觉得自己的类写的不好,不能够记录算出来的结果,他想改改自己的类而又不能影响原来程序的运行。在有接口的情况下是非常简单的,因为他知道了那些东西要保留。

    Calculate.php
    <?php
    // 修改之后的Calculate类
    include "Icalculate.php";
    class Calculate implements Icalculate 
    {
        protected $result;
    
        public function getLastResult() {
            return $this->result;
        }    
    
        public function add($value1, $value2) 
        {
            $this->result = $value1 + $value2;
            return $this->result;     
        }   
        
        public function ave($value1, $value2) 
        {
            $this->result = ($value1 + $value2) / 2;
            return $this->result;
        }
    }```
    现在修改完原来的代码之后,程序可以运行,而且新的功能也实现了,现在可以通过`getLastResult`方法来获得上一次的运行结果。
    ***
    ####总结
    虽然上面的例子看起来都很容易,但是如果把合作的人数放大10倍,每个人的工作量放大100倍,那么接口的意义就会更加明显。如果每个人都使用自己的命名方式,光是在开发调试时改变量名就会是巨大的挑战,而对于修改自己的代码来说也是这样,是一场灾难。所以说推荐大家在写自己的代码的时候先想好接口再手,这样才能在后期的维护中省不少心。
    

    相关文章

      网友评论

          本文标题:面向对象中接口的意义

          本文链接:https://www.haomeiwen.com/subject/veauyttx.html