[译]开/闭原则在Android中的履

原稿地址——O is for Open/Closed
Principle。

当时是SOLID原则于Android中之履行的第二总理,假诺你失去要没有熟练第一部,央走——单一任务规范在Android中的实践。

开/闭原则

以SOLID里的字母O代表的虽是开/闭原则(Open/Close Principle),描述如下:

software entities (classes, modules, functions, etc) should be open
for extension, but closed for modification

任凭起特别简单,多次重复它会绕晕脑子。基本规则是:汝应该努力写起,当需求变动时,无需数转移的代码。我们下Java来写Android,所以可以通过连续和多态实现这极。

一个事例

脚是是工业上运开/闭原则的例子,非凡容易精通。

比方以得算各类不同造型的体积,即使相当简单,这为是自家于直达平等下店遭受的题材。总括有所农作物的面积,为力保提价。如您所知晓,农作物有多重形状,圆形,三角形甚多多边形。

哼了,回到例子上。

用作一个帅之程序完善,大家把总结面积之近乎华而不实为AreaManager,这可单一任务规范——只当总计作物的面积。

假使来一个增长方形的作物,用Rectangle类似来表示。

Rectangle.java

    public class Rectangle {
        private double length;
        private double height; 
        // getters/setters ... 
    }

AreaManager

    public class AreaManager {
        public double calculateArea(ArrayList<Rectangle>... shapes) {
            double area = 0;
            for (Rectangle rect : shapes) {
                area += (rect.getLength() * rect.getHeight()); 
            }
            return area;
        }
    }

AreaManager于大家相遇下一个环的前头还是可以健康干活。

Circle.java

    public class Circle {
        private double radius; 
        // getters/setters ...
    }

既然发生新的图,我们务必修改总计面积的代码

*AreaManager *

    public class AreaManager {
        public double calculateArea(ArrayList<Object>... shapes) {
            double area = 0;
            for (Object shape : shapes) {
                if (shape instanceof Rectangle) {
                    Rectangle rect = (Rectangle)shape;
                    area += (rect.getLength() * rect.getHeight());                
                } else if (shape instanceof Circle) {
                    Circle circle = (Circle)shape;
                    area += (circle.getRadius() * cirlce.getRadius() * Math.PI;
                } else {
                    throw new RuntimeException("Shape not supported");
                }            
            }
            return area;
        }
    }

代码写到此处曾经闻有一致丝味道啦。

苟后续逢三角形,或者其余的图样,大家务必不断重复修改者仿佛。

本条近乎违了开/闭原则,它既是没有停歇对类的改动,也使无对类举办举行,每一样不善新图片出现我们务必修改AreaManager,所以只要避那种气象的来。

透过持续实现开/闭原则

既然AreaManager凡承受总括图形的面积,而每个图形都生单独的乘除方法,最适合逻辑的虽是管总结面积变到每个图形类里。

啊哈,那仍要AreaManager要了解所有图形的有,不然怎么驾驭有图形都是计量面积之艺术?当然通过反射是好的(咳咳咳),或者大家可被抱有图形类都实现一个接口Shape(也足以是独抽象类)

Shape.java

    public interface Shape {
        double getArea(); 
    }

每个接近都会合实现者接口(或者接续抽象类)像这么,

Rectangle.java

    public class Rectangle implements Shape {
    private double length;
    private double height; 
    // getters/setters …

    @Override
    public double getArea() {
        return (length * height);
    } } 

Java,Circle.java

        public class Circle implements Shape {
            private double radius; 
            // getters/setters ...

            @Override
            public double getArea() {
                return (radius * radius * Math.PI);
            }
        }

咱得以用于AreaManager曰镪使抽象方法,使该抱开/闭原则。

    public class AreaManager {
        public double calculateArea(ArrayList<Shape> shapes) {
            double area = 0;
            for (Shape shape : shapes) {
                area += shape.getArea();
            }
            return area;
        }
    }       

咱做的略微修改就设其针对性修改关闭,对展开开放。倘诺急需新增图形,例如多边形,AreaManager早就不再要改,因为光待新增类继承Shape不畏可了。

开/闭原则于Android中之推行

倘你刚好欲对农作物投保,形状的例证非凡吻合学习,但怎么把开/闭原则运行于Android中也?不仅仅是Android,而且是各样语言。Android系统自提供的好像即是开/闭原则的最为好履。我们来拘禁一下。

一个博Android开发的新校友没有意识及之假设,在Android控件像
Button,
Switch
Checkbox都是TextView类。你们会合到其还无冕TextView

android-textview-ocp.png

代表Android控件是针对性修改关闭,对进展开放之。假如想转自己的TextView的文样式,简单地持续TextView,重写相关方就是足以了。Android系统并无珍重而创制新的TextView,它就关注你生出无发出守TextView的束缚,Android会提供特定的法勾勒你的控件。

ViewGroup
也是如此。

android-viewgroup-ocp.png

发很多搭架子像RelativeLayoutLinearLayout等等,Android视图系统了然什么跟它们协同工作,你可通过继承ViewGroup来兑现协调之布局。最终,你可经连续ViewGroupTextView,甚至View来促成自己的控件。

结论

开/闭原则的行使并无囿于于Android视图系统,但她是相对开发者天天还当应用的举办例子。你也可形容来可开/闭原则的代码,做一点纤的计划暨浮泛就能要代码易于拓展及保障,而且给新需要也未用随时修改代码。

总得来说,一个新类型之开任需创建抽象。深刻来拘禁,没理地就吗架空而创办复杂代码,这还非苟落实一个设计形式。依照自己之阅历,我只有在三番五次修改一个近似多次从此才会将她进行抽象,这时,我会确保这多少个类似让完好的测试用例覆盖,然后因开/闭原则重构它。有了全部的测试,才会为自家写起而敬爱可进展的代码,同时保持精炼和顶小可行之支出工作

敬请期待下同样部,利斯科夫替换原则,是我的最爱之一。

相关文章