REST-API设计理念与-Python-Mixin模式

8次阅读

共计 1317 个字符,预计需要花费 4 分钟才能阅读完成。

REST API 设计理念




Python Mixin 模式

背景

民航飞机和直升机都是飞行器,又是交通工具,轿车也是交通工具,但是不会飞
可以多重继承,但这违背了继承必须是”is-a”关系

不同语言的实现方法

java

Java 提供了接口 interface 功能,来实现多重继承

public adstract class Vehicle {
}
public interface Flyable {public void fly();
}
public class FlyableImpl implements Flyable {public void fly() {System.out.printIn('I am flying');
    }
}

public class Airplane extends Vehicle implements Flyable {
    private flyable;
    public Airplane() {flyable = new FlyableImpl();
    }
    public void fly() {flyable.fly();
    }
}

现在我们的飞机同时具有了交通工具及飞行器两种属性,而且我们不需要重写飞行器中的飞行方法,同时我们没有破坏单一继承的原则。飞机就是一种交通工具,可飞行的能力是是飞机的属性,通过继承接口来获取

Python

Python 语言可没有接口功能,但是它可以多重继承。那 Python 是不是就该用多重继承来实现呢?是,也不是。说是,因为从语法上看,的确是通过多重继承实现的。说不是,因为它的继承依然遵守”is-a”关系,从含义上看依然遵循单继承的原则

class Vehicle(object):
    pass
class PlaneMixin(object):
    def fly(self):
        print('I am flying')
class Airplane(Vehicle, PlaneMixin)
    pass

可以看到,上面的 Airplane 类实现了多继承,不过它继承的第二个类我们起名为 PlaneMixin,而不是 Plane,这个并不影响功能,但是会告诉后来读代码的人,这个类是一个 Mixin 类。所以从含义上理解,Airplane 只是一个 Vehicle,不是一个 Plane。这个 Mixin,表示混入 (mix-in),它告诉别人,这个类是作为功能添加到子类中,而不是作为父类,它的作用同 Java 中的接口。
使用 Mixin 类实现多重继承要非常小心

  • 首先它必须表示某一种功能,而不是某个物品,如同 Java 中的 Runnable,Callable 等
  • 其次它必须责任单一,如果有多个功能,那就写多个 Mixin 类
  • 然后,它不依赖于子类的实现
  • 最后,子类即便没有继承这个 Mixin 类,也照样可以工作,就是缺少了某个功能。(比如飞机照样可以载客,就是不能飞了 ^_^)

ReactJS

var PlaneMixin = function() {
    return {fly: function() {console.log('I am flying');
        }
    }
}

var AirplaneComponent = React.createClass({mixins: [PlaneMixin()],
    render: function() {return '<h1>what's mixin<h1>';}
})

正文完
 0