{"id":3865,"date":"2017-11-22T13:11:55","date_gmt":"2017-11-22T07:41:55","guid":{"rendered":"https:\/\/www.innovationm.com\/blog\/?p=3865"},"modified":"2017-11-22T13:35:43","modified_gmt":"2017-11-22T08:05:43","slug":"solid-open-close-principle","status":"publish","type":"post","link":"https:\/\/www.innovationm.com\/blog\/solid-open-close-principle\/","title":{"rendered":"SOLID: Open Close Principle"},"content":{"rendered":"<h3>Open Close Principle<\/h3>\n<p>If you have not read\u00a0<strong>Single Responsibility Principle\u00a0<\/strong>Start from here\u00a0<a href=\"https:\/\/www.innovationm.com\/blog\/solid-single-responsibility-principle\/\" target=\"_blank\" rel=\"noopener\"><strong>Single Responsibility Principle<\/strong><\/a><\/p>\n<p><em><code>Classes should be open for extension, but closed for modification<\/code><\/em><\/p>\n<p>This principle states that any new functionality can be added in a system with minimum modification in the current code. Means the system should be open to additions but it should also closed for modification (or less modification).<\/p>\n<p>A class is closed when it is compiled or shared as library but it is also open since any new class can use it as parent and add new functionality.<\/p>\n<p>The best way to implement Open Close Principle is to start with Single Responsibility Principle (So that each class have only one responsibility) and let the consumer class talk to different classes with abstraction (Interface, So that consumer class need not to know about concrete implementation).<\/p>\n<p>Let&#8217;s assume we have an\u00a0<code>AreaCalculator<\/code>\u00a0class which calculates the sum of areas of different shape like this:<\/p>\n<pre class=\"lang:java decode:true\">class AreaCalculator { \r\n public double area(Object[] shapes) {\r\n  double area = 0;\r\n  for (Object shape in shapes) {\r\n    if (shape instanceof Square) {\r\n      Square square = (Square)shape;\r\n      area += Math.sqrt(square.height);\r\n    }\r\n\r\n    if (shape instanceof Triangle) {\r\n      Triangle triangle = (Triangle)shape;\r\n      double totalHalf = (triangle.firstSide + triangle.secondSide + triangle.thirdSide) \/ 2;\r\n      area += Math.sqrt(totalHalf * (totalHalf - triangle.firstSide) * \r\n       (totalHalf - triangle.secondSide) * (totalHalf - triangle.thirdSide));\r\n    }\r\n\r\n    if (shape instanceof Circle) {\r\n      Circle circle = (Circle)shape;\r\n      area += circle.radius * circle.radius * Math.PI;\r\n    }\r\n  }\r\n  return area;\r\n }\r\n}\r\n\r\nclass Square {\r\n\u00a0 public double height;\r\n}\r\n\r\nclass Circle {\r\n\u00a0 public double radius;\r\n}\r\n\r\nclass Triangle {\r\n\u00a0 public double firstSide;\r\n\u00a0 public double secondSide;\r\n\u00a0 public double thirdSide;\r\n}<\/pre>\n<p>So in above example what if we have to add one more Shape? we have to change the\u00a0<code>AreaCalculator<\/code>\u00a0class. So this class doesn&#8217;t follow OCP (closed to modification).<\/p>\n<p>Let&#8217;s see the following code:<\/p>\n<pre class=\"lang:java decode:true\">class AreaCalculator {\r\n  public double area(Shape[] shapes) {\r\n    double area = 0;\r\n    for (Shape shape in shapes) {\r\n     area += shape.area();\r\n    }\r\n    return area;\r\n  }\r\n}\r\n\r\ninterface Shape {\r\n\u00a0 public double area();\r\n}\r\n\r\nclass Square implements Shape {\r\n\u00a0double height;\r\n \r\n\u00a0public double area() {\r\n\u00a0\u00a0 return Math.sqrt(height);\r\n\u00a0}\r\n}\r\n\r\nclass Circle implements Shape {\r\n  double radius;\r\n\r\n\u00a0 public double area() {\r\n\u00a0\u00a0 return radius * radius * Math.PI;\r\n\u00a0 }\r\n}\r\n\r\nclass Triangle implements Shape {\u00a0\r\n double firstSide;\r\n double secondSide;\r\n double thirdSide;\r\n\r\n\u00a0public double area() {\r\n\u00a0\u00a0 double totalHalf = (firstSide + secondSide + thirdSide) \/ 2;\r\n\u00a0\u00a0 return Math.sqrt(totalHalf * (totalHalf - firstSide) * \r\n    (totalHalf - secondSide) * (totalHalf - thirdSide));\r\n\u00a0}\r\n}<\/pre>\n<p>&nbsp;<\/p>\n<p>Now, In this code if we have to add a new Shape we just need to create a class and implement the\u00a0<code>Shape<\/code>\u00a0interface. There is no modification needed in\u00a0<code>AreaCalculator<\/code>\u00a0class, so it is closed to modification as well as open to extension.<\/p>\n<p><strong>Next:\u00a0<a href=\"https:\/\/www.innovationm.com\/blog\/solid-liskovs-substitution-principle\/\">Likov\u2019s Substitution Principle<\/a><\/strong><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Open Close Principle If you have not read\u00a0Single Responsibility Principle\u00a0Start from here\u00a0Single Responsibility Principle Classes should be open for extension, but closed for modification This principle states that any new functionality can be added in a system with minimum modification in the current code. Means the system should be open to additions but it should [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":3887,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[2,3,71,8],"tags":[215,165,13],"class_list":["post-3865","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-android","category-ios","category-mobile","category-mobile-architecture-and-design","tag-design-pattern","tag-mobile","tag-mobile-design"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>SOLID: Open Close Principle - InnovationM - Blog<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.innovationm.com\/blog\/solid-open-close-principle\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"SOLID: Open Close Principle - InnovationM - Blog\" \/>\n<meta property=\"og:description\" content=\"Open Close Principle If you have not read\u00a0Single Responsibility Principle\u00a0Start from here\u00a0Single Responsibility Principle Classes should be open for extension, but closed for modification This principle states that any new functionality can be added in a system with minimum modification in the current code. Means the system should be open to additions but it should [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.innovationm.com\/blog\/solid-open-close-principle\/\" \/>\n<meta property=\"og:site_name\" content=\"InnovationM - Blog\" \/>\n<meta property=\"article:published_time\" content=\"2017-11-22T07:41:55+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2017-11-22T08:05:43+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.innovationm.com\/blog\/wp-content\/uploads\/2017\/11\/OpenClosedPrinciple.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"750\" \/>\n\t<meta property=\"og:image:height\" content=\"600\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"InnovationM Admin\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"InnovationM Admin\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"2 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/solid-open-close-principle\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/solid-open-close-principle\\\/\"},\"author\":{\"name\":\"InnovationM Admin\",\"@id\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/#\\\/schema\\\/person\\\/a831bf4602d69d1fa452e3de0c8862ed\"},\"headline\":\"SOLID: Open Close Principle\",\"datePublished\":\"2017-11-22T07:41:55+00:00\",\"dateModified\":\"2017-11-22T08:05:43+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/solid-open-close-principle\\\/\"},\"wordCount\":236,\"commentCount\":0,\"image\":{\"@id\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/solid-open-close-principle\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/wp-content\\\/uploads\\\/2017\\\/11\\\/OpenClosedPrinciple.jpg\",\"keywords\":[\"Design Pattern\",\"Mobile\",\"Mobile Design\"],\"articleSection\":[\"Android\",\"iOS\",\"Mobile\",\"Mobile Architecture and Design\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/solid-open-close-principle\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/solid-open-close-principle\\\/\",\"url\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/solid-open-close-principle\\\/\",\"name\":\"SOLID: Open Close Principle - InnovationM - Blog\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/solid-open-close-principle\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/solid-open-close-principle\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/wp-content\\\/uploads\\\/2017\\\/11\\\/OpenClosedPrinciple.jpg\",\"datePublished\":\"2017-11-22T07:41:55+00:00\",\"dateModified\":\"2017-11-22T08:05:43+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/#\\\/schema\\\/person\\\/a831bf4602d69d1fa452e3de0c8862ed\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/solid-open-close-principle\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/solid-open-close-principle\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/solid-open-close-principle\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/wp-content\\\/uploads\\\/2017\\\/11\\\/OpenClosedPrinciple.jpg\",\"contentUrl\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/wp-content\\\/uploads\\\/2017\\\/11\\\/OpenClosedPrinciple.jpg\",\"width\":750,\"height\":600},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/solid-open-close-principle\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"SOLID: Open Close Principle\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/\",\"name\":\"InnovationM - Blog\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/#\\\/schema\\\/person\\\/a831bf4602d69d1fa452e3de0c8862ed\",\"name\":\"InnovationM Admin\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/5c99d9eece9dfbc82297cf34ddd58e9fe05bb52fe66c8f6bf6c0a45bfb6d7629?s=96&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/5c99d9eece9dfbc82297cf34ddd58e9fe05bb52fe66c8f6bf6c0a45bfb6d7629?s=96&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/5c99d9eece9dfbc82297cf34ddd58e9fe05bb52fe66c8f6bf6c0a45bfb6d7629?s=96&r=g\",\"caption\":\"InnovationM Admin\"},\"sameAs\":[\"http:\\\/\\\/www.innovationm.com\\\/\"],\"url\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/author\\\/innovationmadmin\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"SOLID: Open Close Principle - InnovationM - Blog","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.innovationm.com\/blog\/solid-open-close-principle\/","og_locale":"en_US","og_type":"article","og_title":"SOLID: Open Close Principle - InnovationM - Blog","og_description":"Open Close Principle If you have not read\u00a0Single Responsibility Principle\u00a0Start from here\u00a0Single Responsibility Principle Classes should be open for extension, but closed for modification This principle states that any new functionality can be added in a system with minimum modification in the current code. Means the system should be open to additions but it should [&hellip;]","og_url":"https:\/\/www.innovationm.com\/blog\/solid-open-close-principle\/","og_site_name":"InnovationM - Blog","article_published_time":"2017-11-22T07:41:55+00:00","article_modified_time":"2017-11-22T08:05:43+00:00","og_image":[{"width":750,"height":600,"url":"https:\/\/www.innovationm.com\/blog\/wp-content\/uploads\/2017\/11\/OpenClosedPrinciple.jpg","type":"image\/jpeg"}],"author":"InnovationM Admin","twitter_misc":{"Written by":"InnovationM Admin","Est. reading time":"2 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.innovationm.com\/blog\/solid-open-close-principle\/#article","isPartOf":{"@id":"https:\/\/www.innovationm.com\/blog\/solid-open-close-principle\/"},"author":{"name":"InnovationM Admin","@id":"https:\/\/www.innovationm.com\/blog\/#\/schema\/person\/a831bf4602d69d1fa452e3de0c8862ed"},"headline":"SOLID: Open Close Principle","datePublished":"2017-11-22T07:41:55+00:00","dateModified":"2017-11-22T08:05:43+00:00","mainEntityOfPage":{"@id":"https:\/\/www.innovationm.com\/blog\/solid-open-close-principle\/"},"wordCount":236,"commentCount":0,"image":{"@id":"https:\/\/www.innovationm.com\/blog\/solid-open-close-principle\/#primaryimage"},"thumbnailUrl":"https:\/\/www.innovationm.com\/blog\/wp-content\/uploads\/2017\/11\/OpenClosedPrinciple.jpg","keywords":["Design Pattern","Mobile","Mobile Design"],"articleSection":["Android","iOS","Mobile","Mobile Architecture and Design"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.innovationm.com\/blog\/solid-open-close-principle\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.innovationm.com\/blog\/solid-open-close-principle\/","url":"https:\/\/www.innovationm.com\/blog\/solid-open-close-principle\/","name":"SOLID: Open Close Principle - InnovationM - Blog","isPartOf":{"@id":"https:\/\/www.innovationm.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.innovationm.com\/blog\/solid-open-close-principle\/#primaryimage"},"image":{"@id":"https:\/\/www.innovationm.com\/blog\/solid-open-close-principle\/#primaryimage"},"thumbnailUrl":"https:\/\/www.innovationm.com\/blog\/wp-content\/uploads\/2017\/11\/OpenClosedPrinciple.jpg","datePublished":"2017-11-22T07:41:55+00:00","dateModified":"2017-11-22T08:05:43+00:00","author":{"@id":"https:\/\/www.innovationm.com\/blog\/#\/schema\/person\/a831bf4602d69d1fa452e3de0c8862ed"},"breadcrumb":{"@id":"https:\/\/www.innovationm.com\/blog\/solid-open-close-principle\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.innovationm.com\/blog\/solid-open-close-principle\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.innovationm.com\/blog\/solid-open-close-principle\/#primaryimage","url":"https:\/\/www.innovationm.com\/blog\/wp-content\/uploads\/2017\/11\/OpenClosedPrinciple.jpg","contentUrl":"https:\/\/www.innovationm.com\/blog\/wp-content\/uploads\/2017\/11\/OpenClosedPrinciple.jpg","width":750,"height":600},{"@type":"BreadcrumbList","@id":"https:\/\/www.innovationm.com\/blog\/solid-open-close-principle\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.innovationm.com\/blog\/"},{"@type":"ListItem","position":2,"name":"SOLID: Open Close Principle"}]},{"@type":"WebSite","@id":"https:\/\/www.innovationm.com\/blog\/#website","url":"https:\/\/www.innovationm.com\/blog\/","name":"InnovationM - Blog","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.innovationm.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/www.innovationm.com\/blog\/#\/schema\/person\/a831bf4602d69d1fa452e3de0c8862ed","name":"InnovationM Admin","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/5c99d9eece9dfbc82297cf34ddd58e9fe05bb52fe66c8f6bf6c0a45bfb6d7629?s=96&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/5c99d9eece9dfbc82297cf34ddd58e9fe05bb52fe66c8f6bf6c0a45bfb6d7629?s=96&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/5c99d9eece9dfbc82297cf34ddd58e9fe05bb52fe66c8f6bf6c0a45bfb6d7629?s=96&r=g","caption":"InnovationM Admin"},"sameAs":["http:\/\/www.innovationm.com\/"],"url":"https:\/\/www.innovationm.com\/blog\/author\/innovationmadmin\/"}]}},"_links":{"self":[{"href":"https:\/\/www.innovationm.com\/blog\/wp-json\/wp\/v2\/posts\/3865","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.innovationm.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.innovationm.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.innovationm.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.innovationm.com\/blog\/wp-json\/wp\/v2\/comments?post=3865"}],"version-history":[{"count":0,"href":"https:\/\/www.innovationm.com\/blog\/wp-json\/wp\/v2\/posts\/3865\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.innovationm.com\/blog\/wp-json\/wp\/v2\/media\/3887"}],"wp:attachment":[{"href":"https:\/\/www.innovationm.com\/blog\/wp-json\/wp\/v2\/media?parent=3865"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.innovationm.com\/blog\/wp-json\/wp\/v2\/categories?post=3865"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.innovationm.com\/blog\/wp-json\/wp\/v2\/tags?post=3865"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}