{"id":267,"date":"2025-10-13T21:29:53","date_gmt":"2025-10-13T19:29:53","guid":{"rendered":"https:\/\/ewelina-beben.profesjonalnyprogramista.pl\/?p=267"},"modified":"2025-10-14T13:24:47","modified_gmt":"2025-10-14T11:24:47","slug":"zasada-segregacji-interfejsow","status":"publish","type":"post","link":"https:\/\/ewelina-beben.profesjonalnyprogramista.pl\/?p=267","title":{"rendered":"Zasada Segregacji Interfejs\u00f3w"},"content":{"rendered":"\n<hr class=\"wp-block-separator has-css-opacity is-style-default\"\/>\n\n\n\n<hr class=\"wp-block-separator has-css-opacity is-style-default\"\/>\n\n\n\n<div class=\"wp-block-media-text alignwide has-media-on-the-right is-stacked-on-mobile is-vertically-aligned-center has-background\" style=\"background-color:#f1f5c7\"><div class=\"wp-block-media-text__content\">\n<div class=\"wp-block-group is-layout-flow wp-block-group-is-layout-flow\" style=\"padding-top:2em;padding-right:2em;padding-bottom:2em;padding-left:2em\">\n<p style=\"font-size:36px;line-height:1.2\"><strong>Definicja<\/strong><\/p>\n\n\n\n<p class=\"has-extra-small-font-size\">Zasada segregacji interfejs\u00f3w (ang. <em>Interface Segregation Principle<\/em>, ISP) m\u00f3wi, \u017ce<br><strong>\u017caden klient nie powinien by\u0107 zmuszany do implementowania metod, kt\u00f3rych nie u\u017cywa.<\/strong><\/p>\n\n\n\n<p class=\"has-extra-small-font-size\">W praktyce oznacza to, \u017ce <strong>du\u017ce interfejsy nale\u017cy rozdziela\u0107 na mniejsze, bardziej wyspecjalizowane<\/strong>, tak aby klasy implementowa\u0142y tylko to, co rzeczywi\u015bcie jest im potrzebne.<br>To sprawia, \u017ce kod jest bardziej elastyczny, \u0142atwiejszy w utrzymaniu i mniej podatny na b\u0142\u0119dy.<\/p>\n<\/div>\n<\/div><figure class=\"wp-block-media-text__media\"><img data-opt-id=807734801  fetchpriority=\"high\" decoding=\"async\" width=\"1024\" height=\"683\" src=\"https:\/\/mlb55nihrfbl.i.optimole.com\/w:1024\/h:683\/q:mauto\/ig:avif\/http:\/\/ewelina-beben.profesjonalnyprogramista.pl\/wp-content\/uploads\/2025\/10\/Businessmans-hand-holding-question-mark.jpg\" alt=\"\" class=\"wp-image-240 size-full\" srcset=\"https:\/\/mlb55nihrfbl.i.optimole.com\/w:1024\/h:683\/q:mauto\/ig:avif\/https:\/\/ewelina-beben.profesjonalnyprogramista.pl\/wp-content\/uploads\/2025\/10\/Businessmans-hand-holding-question-mark-scaled.jpg 1024w, https:\/\/mlb55nihrfbl.i.optimole.com\/w:300\/h:200\/q:mauto\/ig:avif\/https:\/\/ewelina-beben.profesjonalnyprogramista.pl\/wp-content\/uploads\/2025\/10\/Businessmans-hand-holding-question-mark-scaled.jpg 300w, https:\/\/mlb55nihrfbl.i.optimole.com\/w:768\/h:512\/q:mauto\/ig:avif\/https:\/\/ewelina-beben.profesjonalnyprogramista.pl\/wp-content\/uploads\/2025\/10\/Businessmans-hand-holding-question-mark-scaled.jpg 768w, https:\/\/mlb55nihrfbl.i.optimole.com\/w:1536\/h:1024\/q:mauto\/ig:avif\/https:\/\/ewelina-beben.profesjonalnyprogramista.pl\/wp-content\/uploads\/2025\/10\/Businessmans-hand-holding-question-mark-scaled.jpg 1536w, https:\/\/mlb55nihrfbl.i.optimole.com\/w:1620\/h:1080\/q:mauto\/ig:avif\/https:\/\/ewelina-beben.profesjonalnyprogramista.pl\/wp-content\/uploads\/2025\/10\/Businessmans-hand-holding-question-mark-scaled.jpg 2048w\" sizes=\"(max-width: 1000px) 100vw, 1000px\" \/><\/figure><\/div>\n\n\n\n<div class=\"wp-block-media-text alignwide is-stacked-on-mobile is-vertically-aligned-center has-background\" style=\"background-color:#fffdea\"><figure class=\"wp-block-media-text__media\"><img data-opt-id=613724995  fetchpriority=\"high\" decoding=\"async\" width=\"1024\" height=\"683\" src=\"https:\/\/mlb55nihrfbl.i.optimole.com\/w:1024\/h:683\/q:mauto\/ig:avif\/http:\/\/ewelina-beben.profesjonalnyprogramista.pl\/wp-content\/uploads\/2025\/10\/pexels-rquiros-2219024.jpg\" alt=\"\" class=\"wp-image-275 size-full\" srcset=\"https:\/\/mlb55nihrfbl.i.optimole.com\/w:1024\/h:683\/q:mauto\/ig:avif\/https:\/\/ewelina-beben.profesjonalnyprogramista.pl\/wp-content\/uploads\/2025\/10\/pexels-rquiros-2219024-scaled.jpg 1024w, https:\/\/mlb55nihrfbl.i.optimole.com\/w:300\/h:200\/q:mauto\/ig:avif\/https:\/\/ewelina-beben.profesjonalnyprogramista.pl\/wp-content\/uploads\/2025\/10\/pexels-rquiros-2219024-scaled.jpg 300w, https:\/\/mlb55nihrfbl.i.optimole.com\/w:768\/h:512\/q:mauto\/ig:avif\/https:\/\/ewelina-beben.profesjonalnyprogramista.pl\/wp-content\/uploads\/2025\/10\/pexels-rquiros-2219024-scaled.jpg 768w, https:\/\/mlb55nihrfbl.i.optimole.com\/w:1536\/h:1024\/q:mauto\/ig:avif\/https:\/\/ewelina-beben.profesjonalnyprogramista.pl\/wp-content\/uploads\/2025\/10\/pexels-rquiros-2219024-scaled.jpg 1536w, https:\/\/mlb55nihrfbl.i.optimole.com\/w:1620\/h:1080\/q:mauto\/ig:avif\/https:\/\/ewelina-beben.profesjonalnyprogramista.pl\/wp-content\/uploads\/2025\/10\/pexels-rquiros-2219024-scaled.jpg 2048w\" sizes=\"(max-width: 1000px) 100vw, 1000px\" \/><\/figure><div class=\"wp-block-media-text__content\">\n<div class=\"wp-block-group is-layout-flow wp-block-group-is-layout-flow\" style=\"padding-top:2em;padding-right:2em;padding-bottom:2em;padding-left:2em\">\n<p style=\"font-size:36px;line-height:1.2\"><strong>Przyk\u0142ad z \u017cycia<\/strong><\/p>\n\n\n\n<p class=\"has-extra-small-font-size\">Wyobra\u017amy sobie fabryk\u0119 prefabrykat\u00f3w \u017celbetowych.<br>Mamy r\u00f3\u017cne typy maszyn:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>maszyna zbrojeniowa<\/strong> (wykonuje i montuje zbrojenie),<\/li>\n\n\n\n<li><strong>maszyna zalewaj\u0105ca betonem<\/strong>,<\/li>\n\n\n\n<li><strong>maszyna transportowa<\/strong> (przenosi elementy).<\/li>\n<\/ul>\n\n\n\n<p>Je\u015bli stworzymy <strong>jeden wsp\u00f3lny interfejs<\/strong> <code>Machine<\/code> z metodami <code>assembleReinforcement()<\/code>, <code>pourConcrete()<\/code>, <code>transportElement()<\/code>,<br>to ka\u017cda maszyna b\u0119dzie musia\u0142a implementowa\u0107 wszystkie te metody \u2013 nawet te, kt\u00f3rych <strong>nie potrzebuje<\/strong>.<\/p>\n\n\n\n<p class=\"has-extra-small-font-size\">Lepiej wi\u0119c rozdzieli\u0107 interfejsy: osobno dla zbrojenia, zalewania i transportu.<\/p>\n<\/div>\n<\/div><\/div>\n\n\n\n<h2 class=\"wp-block-heading\" style=\"font-size:38px;line-height:1.4\"><strong>Przyk\u0142ady przed i po zastosowaniu zasady<\/strong><\/h2>\n\n\n\n<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<p><strong>PRZED<\/strong><\/p>\n\n\n\n<p style=\"font-size:18px\">Klasa <code>ReinforcementMachine<\/code> jest zmuszona implementowa\u0107 metody, kt\u00f3re <strong>nie maj\u0105 sensu<\/strong> w jej kontek\u015bcie.<br>To narusza zasad\u0119 segregacji interfejs\u00f3w i prowadzi do b\u0142\u0119d\u00f3w w czasie dzia\u0142ania programu.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: java; title: ; notranslate\" title=\"\">\ninterface Machine {\n    void assembleReinforcement();\n    void pourConcrete();\n    void transportElement();\n}\n\n\nclass ReinforcementMachine implements Machine {\n    @Override\n    public void assembleReinforcement() {\n        System.out.println(&quot;Assembling reinforcement for prefab element...&quot;);\n    }\n\n\n\n    @Override\n    public void pourConcrete() {\n        \/\/ Ta maszyna nie wykonuje tego zadania!\n        throw new UnsupportedOperationException(&quot;Reinforcement machine cannot pour concrete!&quot;);\n    }\n\n\n\n    @Override\n    public void transportElement() {\n        \/\/ I tego te\u017c nie robi\n        throw new UnsupportedOperationException(&quot;Reinforcement machine cannot transport elements!&quot;);\n    }\n}\n<\/pre><\/div>\n\n\n<figure class=\"wp-block-image size-large\"><img data-opt-id=976341489  data-opt-src=\"https:\/\/mlb55nihrfbl.i.optimole.com\/w:683\/h:1024\/q:mauto\/ig:avif\/https:\/\/ewelina-beben.profesjonalnyprogramista.pl\/wp-content\/uploads\/2025\/10\/front-view-young-attractive-lady-blue-construction-suit-helmet-controlling-machines-hangar-working-daytime-buildings-architecture-construction.jpg\"  decoding=\"async\" width=\"683\" height=\"1024\" src=\"data:image/svg+xml,%3Csvg%20viewBox%3D%220%200%20683%201024%22%20width%3D%22683%22%20height%3D%221024%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Crect%20width%3D%22683%22%20height%3D%221024%22%20fill%3D%22transparent%22%2F%3E%3C%2Fsvg%3E\" alt=\"\" class=\"wp-image-270\" old-srcset=\"https:\/\/mlb55nihrfbl.i.optimole.com\/w:683\/h:1024\/q:mauto\/ig:avif\/https:\/\/ewelina-beben.profesjonalnyprogramista.pl\/wp-content\/uploads\/2025\/10\/front-view-young-attractive-lady-blue-construction-suit-helmet-controlling-machines-hangar-working-daytime-buildings-architecture-construction-scaled.jpg 683w, https:\/\/mlb55nihrfbl.i.optimole.com\/w:200\/h:300\/q:mauto\/ig:avif\/https:\/\/ewelina-beben.profesjonalnyprogramista.pl\/wp-content\/uploads\/2025\/10\/front-view-young-attractive-lady-blue-construction-suit-helmet-controlling-machines-hangar-working-daytime-buildings-architecture-construction-scaled.jpg 200w, https:\/\/mlb55nihrfbl.i.optimole.com\/w:720\/h:1080\/q:mauto\/ig:avif\/https:\/\/ewelina-beben.profesjonalnyprogramista.pl\/wp-content\/uploads\/2025\/10\/front-view-young-attractive-lady-blue-construction-suit-helmet-controlling-machines-hangar-working-daytime-buildings-architecture-construction-scaled.jpg 768w, https:\/\/mlb55nihrfbl.i.optimole.com\/w:720\/h:1080\/q:mauto\/ig:avif\/https:\/\/ewelina-beben.profesjonalnyprogramista.pl\/wp-content\/uploads\/2025\/10\/front-view-young-attractive-lady-blue-construction-suit-helmet-controlling-machines-hangar-working-daytime-buildings-architecture-construction-scaled.jpg 1024w, https:\/\/mlb55nihrfbl.i.optimole.com\/w:719\/h:1080\/q:mauto\/ig:avif\/https:\/\/ewelina-beben.profesjonalnyprogramista.pl\/wp-content\/uploads\/2025\/10\/front-view-young-attractive-lady-blue-construction-suit-helmet-controlling-machines-hangar-working-daytime-buildings-architecture-construction-scaled.jpg 1365w, https:\/\/mlb55nihrfbl.i.optimole.com\/w:720\/h:1080\/q:mauto\/ig:avif\/https:\/\/ewelina-beben.profesjonalnyprogramista.pl\/wp-content\/uploads\/2025\/10\/front-view-young-attractive-lady-blue-construction-suit-helmet-controlling-machines-hangar-working-daytime-buildings-architecture-construction-scaled.jpg 1707w\" \/><figcaption class=\"wp-element-caption\">Designed by Freepik<\/figcaption><\/figure>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<p><strong>PO<\/strong><\/p>\n\n\n\n<p style=\"font-size:18px\">Zastosujmy zasad\u0119 ISP i <strong>podzielmy interfejs <code>Machine<\/code> na mniejsze, bardziej wyspecjalizowane interfejsy<\/strong><\/p>\n\n\n\n<p style=\"font-size:18px\"><strong>Dlaczego teraz dzia\u0142a lepiej:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Dodanie nowego typu maszyny (np. maszyny szlifuj\u0105cej) wymaga jedynie nowego interfejsu i klasy \u2014 bez modyfikowania istniej\u0105cych.<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Ka\u017cda maszyna implementuje tylko te metody, kt\u00f3re rzeczywi\u015bcie wykonuje.<\/li>\n<\/ul>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: java; title: ; notranslate\" title=\"\">\n\/\/ Interfejs dla maszyn wykonuj\u0105cych zbrojenie\ninterface ReinforcementWorker {\n    void assembleReinforcement();\n}\n\n\/\/ Interfejs dla maszyn zalewaj\u0105cych betonem\ninterface ConcreteWorker {\n    void pourConcrete();\n}\n\n\/\/ Interfejs dla maszyn transportowych\ninterface TransportWorker {\n    void transportElement();\n}\n\n\/\/ Klasa implementuj\u0105ca tylko to, co potrzebne\nclass ReinforcementMachine implements ReinforcementWorker {\n    @Override\n    public void assembleReinforcement() {\n        System.out.println(&quot;Assembling reinforcement for prefab element...&quot;);\n    }\n}\n\nclass ConcreteMachine implements ConcreteWorker {\n    @Override\n    public void pourConcrete() {\n        System.out.println(&quot;Pouring concrete into mold...&quot;);\n    }\n}\n\nclass TransportMachine implements TransportWorker {\n    @Override\n    public void transportElement() {\n        System.out.println(&quot;Transporting prefab element to curing area...&quot;);\n    }\n}\n\n\/\/ Klasa g\u0142\u00f3wna \u2013 przyk\u0142ad u\u017cycia\npublic class Main {\n    public static void main(String&#x5B;] args) {\n        ReinforcementWorker rebar = new ReinforcementMachine();\n        ConcreteWorker concrete = new ConcreteMachine();\n        TransportWorker transport = new TransportMachine();\n\n        rebar.assembleReinforcement();\n        concrete.pourConcrete();\n        transport.transportElement();\n    }\n}\n<\/pre><\/div><\/div>\n<\/div>\n\n\n\n<p><\/p>\n\n\n\n<div class=\"wp-block-columns alignwide is-layout-flex wp-container-core-columns-is-layout-d2da2050 wp-block-columns-is-layout-flex\" style=\"margin-bottom:0\">\n<div class=\"wp-block-column has-text-color has-background has-link-color wp-elements-14db8f720e94dadb4a89402e1602b9d5 is-layout-flow wp-block-column-is-layout-flow\" style=\"color:#000000;background-color:#ffe97d;padding-top:2em;padding-right:2em;padding-bottom:2em;padding-left:2em\">\n<p class=\"has-normal-font-size\" style=\"line-height:1.5\"><strong>Kiedy zasada jest wa\u017cna?<\/strong><\/p>\n\n\n\n<hr class=\"wp-block-separator has-css-opacity is-style-wide\"\/>\n\n\n\n<ul class=\"wp-block-list\">\n<li>W du\u017cych projektach z wieloma typami obiekt\u00f3w o r\u00f3\u017cnych rolach,<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Gdy interfejsy zaczynaj\u0105 by\u0107 zbyt \u201eci\u0119\u017ckie\u201d (zawieraj\u0105 za du\u017co metod).<\/li>\n<\/ul>\n<\/div>\n\n\n\n<div class=\"wp-block-column has-text-color has-background has-link-color wp-elements-822d708468f326086473a3b04f4d7999 is-layout-flow wp-block-column-is-layout-flow\" style=\"color:#000000;background-color:#d1d1e1;padding-top:2em;padding-right:2em;padding-bottom:2em;padding-left:2em\">\n<p class=\"has-normal-font-size\" style=\"line-height:1.5\"><strong>Na co zwraca\u0107 uwag\u0119:<\/strong><\/p>\n\n\n\n<hr class=\"wp-block-separator has-css-opacity is-style-wide\"\/>\n\n\n\n<ul class=\"wp-block-list has-normal-font-size\">\n<li>Lepiej mie\u0107 <strong>kilka ma\u0142ych interfejs\u00f3w<\/strong> ni\u017c jeden ogromny,<\/li>\n\n\n\n<li>Klasy powinny implementowa\u0107 tylko to, co jest im naprawd\u0119 potrzebne.<\/li>\n<\/ul>\n<\/div>\n\n\n\n<div class=\"wp-block-column has-text-color has-background has-link-color wp-elements-6945783cdc91836de3ccf4a59ef4c1e3 is-layout-flow wp-block-column-is-layout-flow\" style=\"color:#000000;background-color:#c0ebf1;padding-top:2em;padding-right:2em;padding-bottom:2em;padding-left:2em\">\n<p class=\"has-normal-font-size\"><strong>Trudno\u015bci:<\/strong><\/p>\n\n\n\n<hr class=\"wp-block-separator has-css-opacity is-style-wide\"\/>\n\n\n\n<ul class=\"wp-block-list has-normal-font-size\">\n<li>Pocz\u0105tkuj\u0105cy cz\u0119sto tworz\u0105 zbyt du\u017co drobnych interfejs\u00f3w, przez co projekt staje si\u0119 nadmiernie skomplikowany,<\/li>\n\n\n\n<li>Trzeba znale\u017a\u0107 <strong>balans mi\u0119dzy szczeg\u00f3\u0142owo\u015bci\u0105 a praktyczno\u015bci\u0105<\/strong>.<\/li>\n<\/ul>\n<\/div>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Przyk\u0142ady przed i po zastosowaniu zasady PRZED Klasa ReinforcementMachine jest zmuszona implementowa\u0107 metody, kt\u00f3re nie maj\u0105 sensu w jej kontek\u015bcie.To narusza zasad\u0119 segregacji interfejs\u00f3w i prowadzi do b\u0142\u0119d\u00f3w w czasie dzia\u0142ania programu. PO Zastosujmy zasad\u0119 ISP i podzielmy interfejs Machine na mniejsze, bardziej wyspecjalizowane interfejsy Dlaczego teraz dzia\u0142a lepiej: Kiedy zasada jest wa\u017cna? Na co [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":268,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[9],"tags":[],"class_list":["post-267","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-solid"],"_links":{"self":[{"href":"https:\/\/ewelina-beben.profesjonalnyprogramista.pl\/index.php?rest_route=\/wp\/v2\/posts\/267","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/ewelina-beben.profesjonalnyprogramista.pl\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/ewelina-beben.profesjonalnyprogramista.pl\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/ewelina-beben.profesjonalnyprogramista.pl\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/ewelina-beben.profesjonalnyprogramista.pl\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=267"}],"version-history":[{"count":6,"href":"https:\/\/ewelina-beben.profesjonalnyprogramista.pl\/index.php?rest_route=\/wp\/v2\/posts\/267\/revisions"}],"predecessor-version":[{"id":299,"href":"https:\/\/ewelina-beben.profesjonalnyprogramista.pl\/index.php?rest_route=\/wp\/v2\/posts\/267\/revisions\/299"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/ewelina-beben.profesjonalnyprogramista.pl\/index.php?rest_route=\/wp\/v2\/media\/268"}],"wp:attachment":[{"href":"https:\/\/ewelina-beben.profesjonalnyprogramista.pl\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=267"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/ewelina-beben.profesjonalnyprogramista.pl\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=267"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/ewelina-beben.profesjonalnyprogramista.pl\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=267"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}