PageSourceSearch

https://solidbook.vercel.app/_next/static/chunks/pages/ocp/limits-and-caveats-1b82b9b43e42c23c.js

js solidbook.vercel.app collected 2026-10-03 07:27:58 UTC 7,971 bytes, 2 lines download raw bytes

1(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[82],{9995:function(e,n,t){"use strict";t.r(n),t.d(n,{default:function(){return MDXContent},meta:function(){return o}});var r=t(9499),i=t(5893),s=t(1151),c=t(1214);function ownKeys(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);n&&(r=r.filter(function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable})),t.push.apply(t,r)}return t}function _objectSpread(e){for(var n=1;n<arguments.length;n++){var t=null!=arguments[n]?arguments[n]:{};n%2?ownKeys(Object(t),!0).forEach(function(n){(0,r.Z)(e,n,t[n])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(t)):ownKeys(Object(t)).forEach(function(n){Object.defineProperty(e,n,Object.getOwnPropertyDescriptor(t,n))})}return e}var o={title:"OCP | Ограничения и подводные камни",description:"Ограничения принципа открытости-закрытости, с которыми разработчики сталкиваются чаще всего"},MDXLayout=function(e){var n=e.children;return(0,i.jsx)(c.Z,{meta:o,children:n})};function _createMdxContent(e){var n=_objectSpread(_objectSpread({a:"a",h1:"h1",h2:"h2",li:"li",p:"p",section:"section",ul:"ul"},(0,s.a)()),e.components);return(0,i.jsxs)(n.section,{children:[(0,i.jsx)(n.h1,{children:"Ограничения и подводные камни"}),(0,i.jsx)(n.p,{children:"У каждого принципа есть ограничения и область применения. Для OCP характерны следующие ограничения и подводные камни."}),(0,i.jsxs)(n.section,{children:[(0,i.jsx)(n.h2,{children:"Система не может быть закрыта на 100%"}),(0,i.jsx)(n.p,{children:"Всегда есть изменения, которые невозможно внести, не изменив код какого-то модуля, поэтому при проектировании важен стратегический подход. Необходимо определить, от каких именно изменений и какие именно модули вы хотите закрыть."}),(0,i.jsx)(n.p,{children:"Следует учитывать, что люди очень плохо умеют прогнозировать изменения. Даже имея достаточно знаний о системе и опыта, проектировщики не могут быть уверены, что предусмотрели все возможные варианты развития системы."}),(0,i.jsxs)(n.p,{children:["OCP предлагает подход ",(0,i.jsx)(n.a,{href:"https://agiledesign.org/2015/01/18/jit-just-in-time-and-software-development/",children:"Just-in-time design"}),", при котором новые сущности добавляются в систему по мере необходимости, но не раньше. Это чем-то похоже на отказ от ранней оптимизации и ",(0,i.jsx)(n.a,{href:"http://tonsky.me/blog/concrete-vs-abstract/",children:"раннего добавления абстракций"}),"."]}),(0,i.jsx)(n.p,{children:"Цель подхода в том, чтобы не создавать абстракции на пустом месте. Один из критериев хорошего дизайна — простота, поэтому использовать OCP следует всегда с оглядкой на то, насколько система получится простой в итоге."})]}),(0,i.jsxs)(n.section,{children:[(0,i.jsx)(n.h2,{children:"Большое количество сущностей"}),(0,i.jsxs)(n.p,{children:["Добавление функциональности менее рискованно, чем изменение существующей, но взамен мы рискуем ",(0,i.jsx)(n.a,{href:"https://softwareengineering.stackexchange.com/questions/170547/refactoring-and-open-closed-principle",children:"увеличить количество сущностей"}),". Бесконтрольное и бездумное следование OCP может приводить к ситуациям, когда интерфейсов станет слишком много, а функциональность — станет раздробленной."]}),(0,i.jsxs)(n.p,{children:["Хороший дизайн системы — это в первую очередь простой дизайн. Чем меньше сущностей мы создаём для решения проблемы, тем ",(0,i.jsx)(n.a,{href:"https://ru.wikipedia.org/wiki/%D0%94%D0%B7%D0%B5%D0%BD_%D0%9F%D0%B8%D1%82%D0%BE%D0%BD%D0%B0",children:"выше вероятность, что дизайн хороший"}),", поэтому следовать OCP необходимо с осторожностью."]})]}),(0,i.jsxs)(n.section,{children:[(0,i.jsx)(n.h2,{children:"Может быть не нужен для маленьких приложений"}),(0,i.jsx)(n.p,{children:"OCP нацелен на быстрое и дешёвое добавление функциональности и масштабирование системы. Он окупается, если система действительно большая, и проверять, как повлияло изменение кода, очень дорого или долго (или невозможно)."}),(0,i.jsxs)(n.p,{children:["Если же приложение маленькое, то OCP может ",(0,i.jsx)(n.a,{href:"https://www.tonymarston.net/php-mysql/not-so-solid-oo-principles.html",children:"превратиться в принцип ради принципа"})," — когда разработчики будут писать бойлерплейт-код для создания новых сущностей без видимой и ощутимой пользы."]}),(0,i.jsx)(n.p,{children:"OCP следует применять, если польза от него значительно выше, чем затраты от следования ему."})]}),(0,i.jsxs)(n.section,{children:[(0,i.jsx)(n.h2,{children:"Материалы к разделу"}),(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"https://agiledesign.org/2015/01/18/jit-just-in-time-and-software-development/",children:"Just-in-time design"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"http://tonsky.me/blog/concrete-vs-abstract/",children:"Solve problem at hand"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"https://softwareengineering.stackexchange.com/questions/170547/refactoring-and-open-closed-principle",children:"Refactoring and OCP"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"https://ru.wikipedia.org/wiki/%D0%94%D0%B7%D0%B5%D0%BD_%D0%9F%D0%B8%D1%82%D0%BE%D0%BD%D0%B0",children:"Дзен питона"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"https://ru.wikipedia.org/wiki/%D0%91%D1%80%D0%B8%D1%82%D0%B2%D0%B0_%D0%9E%D0%BA%D0%BA%D0%B0%D0%BC%D0%B0",children:"Бритва Оккама"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"https://www.tonymarston.net/php-mysql/not-so-solid-oo-principles.html",children:"Not so SOLID principles"})}),"\n"]})]})]})}function MDXContent(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return(0,i.jsx)(MDXLayout,_objectSpread(_objectSpread({},e),{},{children:(0,i.jsx)(_createMdxContent,_objectSpread({},e))}))}},4405:function(e,n,t){(window.__NEXT_P=window.__NEXT_P||[]).push(["/ocp/limits-and-caveats",function(){return t(9995)}])}},function(e){e.O(0,[374,214,774,888,179],function(){return e(e.s=4405)}),_N_E=e.O()}]);
2//# sourceMappingURL=limits-and-caveats-1b82b9b43e42c23c.js.map

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.