{"id":417,"date":"2026-07-02T12:58:12","date_gmt":"2026-07-02T12:58:12","guid":{"rendered":"https:\/\/patryk-sobilo.profesjonalnyprogramista.pl\/?p=417"},"modified":"2026-07-02T13:05:09","modified_gmt":"2026-07-02T13:05:09","slug":"interface-segregation-principle","status":"publish","type":"post","link":"https:\/\/patryk-sobilo.profesjonalnyprogramista.pl\/index.php\/2026\/07\/02\/interface-segregation-principle\/","title":{"rendered":"Interface Segregation Principle"},"content":{"rendered":"\n<h4 class=\"wp-block-heading\">Many Small Interfaces Instead of One Large Interface<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">The <strong>Interface Segregation Principle (ISP)<\/strong> states that no class should be forced to implement methods that it does not use.<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\u201cClients should not be forced to depend upon interfaces that they do not use.\u201d \u2014 Robert C. Martin<\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">Simply put:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Many small, specialized interfaces are better than one large, general-purpose interface.<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">If a class implementing an interface is forced to define methods that make no sense for it, that is a sign that the interface is too broad and violates ISP.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Real-Life Example: How to Understand It?<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Imagine you are a new employee signing an employment contract.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Instead of receiving a standard software developer contract, HR hands you an agreement that requires you to:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>write code,<\/li>\n\n\n\n<li>clean the office,<\/li>\n\n\n\n<li>conduct workplace safety training,<\/li>\n\n\n\n<li>work at the reception desk,<\/li>\n\n\n\n<li>repair the photocopier.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Of course, you could sign it, but what about the responsibilities that have nothing to do with your role?<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">What would you do with the clause about repairing photocopiers if you&#8217;ve never even touched one?<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">You would somehow need to handle it, most likely by leaving it blank or writing:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">&#8220;Not applicable.&#8221;<\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">And that is exactly where the problem begins.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The contract says you are responsible for something even though you do not actually do it.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Programming works the same way.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">When a class implements an interface, it commits to providing implementations for all of its methods. If the interface is too broad, the class must somehow deal with methods that do not apply to it\u2014typically by throwing an exception or leaving the method body empty.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">That is an ISP violation.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Instead of one &#8220;contract for everything,&#8221; it is much better to have several specialized contracts:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>a contract for software developers (coding, code reviews),<\/li>\n\n\n\n<li>a contract for cleaning staff (cleaning and maintenance),<\/li>\n\n\n\n<li>a contract for receptionists (guest services and phone support).<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Everyone signs only the contract that matches their actual responsibilities.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">No sections are empty.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">No obligations are fake.<\/p>\n\n\n\n<h5 class=\"wp-block-heading\">A Thought Exercise<\/h5>\n\n\n\n<p class=\"wp-block-paragraph\">Let&#8217;s imagine a human resources system.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">What happens if we create one generic <code>Employee<\/code> interface containing methods for every possible role?<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Let&#8217;s look at the code.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Example \u2014 ISP Violation<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Suppose we are building a factory workforce management system.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The factory has three types of workers:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>a production worker who operates machinery,<\/li>\n\n\n\n<li>a manager who attends meetings and manages teams,<\/li>\n\n\n\n<li>an industrial robot that performs manufacturing tasks but neither eats nor takes breaks.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">In the first approach, we create a single interface for everyone:<\/p>\n\n\n<pre style=\"padding-left: 80px;\"><!--ScriptorStartFragment--><\/pre>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">\/\/ One &#8220;big contract&#8221; for every worker in the factory<\/div>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">interface Employee {<\/div>\n<pre style=\"padding-left: 80px;\">\u00a0<\/pre>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">\u00a0\u00a0\u00a0 \/\/ Every worker can work<\/div>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">\u00a0\u00a0\u00a0 void work();<\/div>\n<pre style=\"padding-left: 80px;\">\u00a0<\/pre>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">\u00a0\u00a0\u00a0 \/\/ Every worker takes a lunch break<\/div>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">\u00a0\u00a0\u00a0 void takeLunchBreak();<\/div>\n<pre style=\"padding-left: 80px;\">\u00a0<\/pre>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">\u00a0\u00a0\u00a0 \/\/ Every worker attends board meetings<\/div>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">\u00a0\u00a0\u00a0 void attendBoardMeeting();<\/div>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">}<!--ScriptorEndFragment--><\/div>\n\n\n<p class=\"wp-block-paragraph\">Now let&#8217;s implement various worker types.<\/p>\n\n\n\n<h5 class=\"wp-block-heading\">Production Worker<\/h5>\n\n\n<p style=\"padding-left: 80px;\"><!--ScriptorStartFragment--><\/p>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">class ProductionWorker implements Employee {<\/div>\n<p style=\"padding-left: 160px;\">\u00a0<\/p>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">\u00a0\u00a0\u00a0 @Override<\/div>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">\u00a0\u00a0\u00a0 public void work() {<\/div>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 System.out.println(&#8220;I operate a machine on the factory floor.&#8221;);<\/div>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">\u00a0\u00a0\u00a0 }<\/div>\n<p style=\"padding-left: 160px;\">\u00a0<\/p>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">\u00a0\u00a0\u00a0 @Override<\/div>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">\u00a0\u00a0\u00a0 public void takeLunchBreak() {<\/div>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 System.out.println(&#8220;I go to the cafeteria for lunch.&#8221;);<\/div>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">\u00a0\u00a0\u00a0 }<\/div>\n<p style=\"padding-left: 160px;\">\u00a0<\/p>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">\u00a0\u00a0\u00a0 @Override<\/div>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">\u00a0\u00a0\u00a0 public void attendBoardMeeting() {<\/div>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ Problem: production workers do not attend board meetings!<\/div>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 throw new UnsupportedOperationException(<\/div>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 &#8220;Production workers do not attend board meetings!&#8221;<\/div>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 );<\/div>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">\u00a0\u00a0\u00a0 }<\/div>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">}<!--ScriptorEndFragment--><\/div>\n<p style=\"padding-left: 160px;\"><br \/><!--ScriptorEndFragment--><\/p>\n\n\n<h5 class=\"wp-block-heading\">Industrial Robot<\/h5>\n\n\n<pre style=\"padding-left: 80px;\"><!--ScriptorStartFragment--><\/pre>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">class Robot implements Employee {<\/div>\n<pre style=\"padding-left: 80px;\">\u00a0<\/pre>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">\u00a0\u00a0\u00a0 @Override<\/div>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">\u00a0\u00a0\u00a0 public void work() {<\/div>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 System.out.println(&#8220;I perform tasks on the assembly line.&#8221;);<\/div>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">\u00a0\u00a0\u00a0 }<\/div>\n<pre style=\"padding-left: 80px;\">\u00a0<\/pre>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">\u00a0\u00a0\u00a0 @Override<\/div>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">\u00a0\u00a0\u00a0 public void takeLunchBreak() {<\/div>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ Problem: robots do not eat!<\/div>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 throw new UnsupportedOperationException(<\/div>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 &#8220;Robots do not need lunch breaks!&#8221;<\/div>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 );<\/div>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">\u00a0\u00a0\u00a0 }<\/div>\n<pre style=\"padding-left: 80px;\">\u00a0<\/pre>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">\u00a0\u00a0\u00a0 @Override<\/div>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">\u00a0\u00a0\u00a0 public void attendBoardMeeting() {<\/div>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ Problem: robots do not attend meetings!<\/div>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 throw new UnsupportedOperationException(<\/div>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 &#8220;Robots do not attend meetings!&#8221;<\/div>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 );<\/div>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">\u00a0\u00a0\u00a0 }<\/div>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">}<!--ScriptorEndFragment--><\/div>\n\n\n<h4 class=\"wp-block-heading\">Manager<\/h4>\n\n\n<p><!--ScriptorStartFragment--><\/p>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">class Manager implements Employee {<\/div>\n<p style=\"padding-left: 80px;\">\u00a0<\/p>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">\u00a0\u00a0\u00a0 @Override<\/div>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">\u00a0\u00a0\u00a0 public void work() {<\/div>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 System.out.println(<\/div>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 &#8220;I review reports and manage the team.&#8221;<\/div>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 );<\/div>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">\u00a0\u00a0\u00a0 }<\/div>\n<p style=\"padding-left: 80px;\">\u00a0<\/p>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">\u00a0\u00a0\u00a0 @Override<\/div>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">\u00a0\u00a0\u00a0 public void takeLunchBreak() {<\/div>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 System.out.println(<\/div>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 &#8220;I have lunch with a client.&#8221;<\/div>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 );<\/div>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">\u00a0\u00a0\u00a0 }<\/div>\n<p style=\"padding-left: 80px;\">\u00a0<\/p>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">\u00a0\u00a0\u00a0 @Override<\/div>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">\u00a0\u00a0\u00a0 public void attendBoardMeeting() {<\/div>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 System.out.println(<\/div>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 &#8220;I lead the quarterly board meeting.&#8221;<\/div>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 );<\/div>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">\u00a0\u00a0\u00a0 }<\/div>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">}<!--ScriptorEndFragment--><\/div>\n\n\n<h5 class=\"wp-block-heading\">What&#8217;s Wrong with This Design?<\/h5>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Classes Throw Exceptions for Unsupported Methods<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The <code>Robot<\/code> class implements <code>takeLunchBreak()<\/code>, but the only sensible thing it can do is throw an exception.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Anyone calling this method gets a runtime error instead of a compile-time indication that the operation is invalid.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>The Interface Lies<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">When somebody sees:<\/p>\n\n\n<!--ScriptorStartFragment-->\n<p style=\"padding-left: 80px;\">Robot implements Employee<\/p>\n<!--ScriptorEndFragment-->\n\n\n<p class=\"wp-block-paragraph\">they naturally assume that a robot can do everything an <code>Employee<\/code> can do, including taking lunch breaks.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">That assumption is false.<\/p>\n\n\n\n<h5 class=\"wp-block-heading\">Changes Affect Everyone<\/h5>\n\n\n\n<p class=\"wp-block-paragraph\">Suppose we add:<\/p>\n\n\n<!--ScriptorStartFragment-->\n<p style=\"padding-left: 80px;\">void signUnionAgreement();<\/p>\n<!--ScriptorEndFragment-->\n\n\n<p class=\"wp-block-paragraph\">to the <code>Employee<\/code> interface.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Now every implementing class\u2014including <code>Robot<\/code>\u2014must provide an implementation, even though robots will never sign any agreement.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Example \u2014 ISP-Compliant Design<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Let&#8217;s improve the design.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Instead of one large contract, we create several smaller interfaces, each describing a single capability.<\/p>\n\n\n\n<h5 class=\"wp-block-heading\">Work Capability<\/h5>\n\n\n<!--ScriptorStartFragment-->\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">interface Workable {<\/div>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">\u00a0\u00a0\u00a0 void work();<\/div>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">}<!--ScriptorEndFragment--><\/div>\n\n\n<h5 class=\"wp-block-heading\">Eating Capability<\/h5>\n\n\n<pre style=\"padding-left: 80px;\"><!--ScriptorStartFragment--><\/pre>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">interface Eatable {<\/div>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">\u00a0\u00a0\u00a0 void takeLunchBreak();<\/div>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">}<!--ScriptorEndFragment--><\/div>\n\n\n<h5 class=\"wp-block-heading\">Management Capability<\/h5>\n\n\n<pre style=\"padding-left: 80px;\"><!--ScriptorStartFragment--><\/pre>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">interface Manageable {<\/div>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">\u00a0\u00a0\u00a0 void attendBoardMeeting();<\/div>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">}<!--ScriptorEndFragment--><\/div>\n\n\n<p class=\"wp-block-paragraph\">Now each class implements only the interfaces that actually apply to it.<\/p>\n\n\n\n<h5 class=\"wp-block-heading\">Production Worker<\/h5>\n\n\n<p><!--ScriptorStartFragment--><\/p>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">class ProductionWorker<\/div>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 implements Workable, Eatable {<\/div>\n<p style=\"padding-left: 80px;\">\u00a0<\/p>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">\u00a0\u00a0\u00a0 @Override<\/div>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">\u00a0\u00a0\u00a0 public void work() {<\/div>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 System.out.println(<\/div>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 &#8220;I operate a machine on the factory floor.&#8221;<\/div>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 );<\/div>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">\u00a0\u00a0\u00a0 }<\/div>\n<p style=\"padding-left: 80px;\">\u00a0<\/p>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">\u00a0\u00a0\u00a0 @Override<\/div>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">\u00a0\u00a0\u00a0 public void takeLunchBreak() {<\/div>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 System.out.println(<\/div>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 &#8220;I go to the cafeteria for lunch.&#8221;<\/div>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 );<\/div>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">\u00a0\u00a0\u00a0 }<\/div>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">}<!--ScriptorEndFragment--><\/div>\n\n\n<h5 class=\"wp-block-heading\">Robot<\/h5>\n\n\n<!--ScriptorStartFragment-->\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">class Robot implements Workable {<\/div>\n<p style=\"padding-left: 80px;\">\u00a0<\/p>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">\u00a0\u00a0\u00a0 @Override<\/div>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">\u00a0\u00a0\u00a0 public void work() {<\/div>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 System.out.println(<\/div>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 &#8220;I perform tasks on the assembly line.&#8221;<\/div>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 );<\/div>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">\u00a0\u00a0\u00a0 }<\/div>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">}<!--ScriptorEndFragment--><\/div>\n\n\n<h5 class=\"wp-block-heading\">Manager<\/h5>\n\n\n<!--ScriptorStartFragment-->\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">class Manager<\/div>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 implements Eatable, Manageable {<\/div>\n<p style=\"padding-left: 80px;\">\u00a0<\/p>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">\u00a0\u00a0\u00a0 @Override<\/div>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">\u00a0\u00a0\u00a0 public void takeLunchBreak() {<\/div>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 System.out.println(<\/div>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 &#8220;I have lunch with a client.&#8221;<\/div>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 );<\/div>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">\u00a0\u00a0\u00a0 }<\/div>\n<p style=\"padding-left: 80px;\">\u00a0<\/p>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">\u00a0\u00a0\u00a0 @Override<\/div>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">\u00a0\u00a0\u00a0 public void attendBoardMeeting() {<\/div>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 System.out.println(<\/div>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 &#8220;I lead the quarterly board meeting.&#8221;<\/div>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 );<\/div>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">\u00a0\u00a0\u00a0 }<\/div>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">}<!--ScriptorEndFragment--><\/div>\n\n\n<h4 class=\"wp-block-heading\">What Did We Improve?<\/h4>\n\n\n\n<h5 class=\"wp-block-heading\">No More Unnecessary Exceptions<\/h5>\n\n\n\n<p class=\"wp-block-paragraph\">The <code>Robot<\/code> class does not have a <code>takeLunchBreak()<\/code> method.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Nobody can call it accidentally.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The error is impossible because the method does not exist.<\/p>\n\n\n\n<h5 class=\"wp-block-heading\">Interfaces Are Honest<\/h5>\n\n\n\n<p class=\"wp-block-paragraph\">If a class implements <code>Eatable<\/code>, it can actually eat.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">If it implements <code>Workable<\/code>, it can actually work.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The contract accurately reflects reality.<\/p>\n\n\n\n<h5 class=\"wp-block-heading\">Changes Are Isolated<\/h5>\n\n\n\n<p class=\"wp-block-paragraph\">Adding a new method to <code>Manageable<\/code> affects only managers.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Robots and production workers remain untouched.<\/p>\n\n\n\n<h5 class=\"wp-block-heading\">Composition Replaces a Monolith<\/h5>\n\n\n\n<p class=\"wp-block-paragraph\">Classes can implement any combination of interfaces.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Just like in real life, a person may fulfill multiple roles at the same time.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Why Is ISP Important?<\/h4>\n\n\n\n<h5 class=\"wp-block-heading\">Easier to Understand<\/h5>\n\n\n\n<p class=\"wp-block-paragraph\">A small interface with one or two methods clearly communicates its purpose.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Seeing:<\/p>\n\n\n<!--ScriptorStartFragment-->\n<p style=\"padding-left: 80px;\">implements Eatable<\/p>\n<!--ScriptorEndFragment-->\n\n\n<p class=\"wp-block-paragraph\">immediately tells us what the class can do.<\/p>\n\n\n\n<h5 class=\"wp-block-heading\">Changes Are Safe and Isolated<\/h5>\n\n\n\n<p class=\"wp-block-paragraph\">When we extend <code>Manageable<\/code>, only classes implementing that interface are affected.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Unrelated classes remain untouched.<\/p>\n\n\n\n<h5 class=\"wp-block-heading\">Simpler Testing<\/h5>\n\n\n\n<p class=\"wp-block-paragraph\">If a method depends on:<\/p>\n\n\n<pre style=\"padding-left: 80px;\"><!--ScriptorStartFragment-->Workable<!--ScriptorEndFragment--><\/pre>\n\n\n<p class=\"wp-block-paragraph\">we can create a very small mock implementation containing only a single method.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">There is no need to implement ten unused methods.<\/p>\n\n\n\n<h5 class=\"wp-block-heading\">Better Team Collaboration<\/h5>\n\n\n\n<p class=\"wp-block-paragraph\">Narrow interfaces reduce merge conflicts.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Different developers can work independently on different interfaces without constantly interfering with one another.<\/p>\n\n\n\n<h5 class=\"wp-block-heading\">Consequences of Ignoring ISP<\/h5>\n\n\n\n<p class=\"wp-block-paragraph\">Imagine an interface with 30 methods implemented by 20 classes.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Adding a single new method forces modifications to all 20 classes\u2014even those that will never use it.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Developers often respond by adding:<\/p>\n\n\n<!--ScriptorStartFragment-->\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">throw new UnsupportedOperationException();<\/div>\n<!--ScriptorEndFragment-->\n\n\n<p class=\"wp-block-paragraph\">and moving on, creating traps for future team members.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">When Should You Apply ISP?<\/h4>\n\n\n\n<h5 class=\"wp-block-heading\">When Classes Leave Methods Empty or Throw Exceptions<\/h5>\n\n\n\n<p class=\"wp-block-paragraph\">This is the strongest signal of an ISP violation.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The class is essentially saying:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">&#8220;I have to implement this, but it makes no sense for me.&#8221;<\/p>\n<\/blockquote>\n\n\n\n<h5 class=\"wp-block-heading\">When Interface Changes Affect Unrelated Classes<\/h5>\n\n\n\n<p class=\"wp-block-paragraph\">If adding a method forces modifications in classes that will never use that method, the interface is too broad.<\/p>\n\n\n\n<h5 class=\"wp-block-heading\">In APIs and Libraries<\/h5>\n\n\n\n<p class=\"wp-block-paragraph\">Spring Framework is an excellent example of ISP.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Instead of one large repository interface, Spring Data provides specialized interfaces:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>CrudRepository<\/code><\/li>\n\n\n\n<li><code>PagingAndSortingRepository<\/code><\/li>\n\n\n\n<li><code>JpaRepository<\/code><\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Users choose only the level of functionality they actually need.<\/p>\n\n\n<p><!--ScriptorStartFragment--><\/p>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">\/\/ Minimal functionality<\/div>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">interface ProductRepository<\/div>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 extends CrudRepository&lt;Product, Long&gt; {<\/div>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">}<!--ScriptorEndFragment--><\/div>\n\n<p><!--ScriptorStartFragment--><\/p>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">\/\/ Extended functionality if needed<\/div>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">interface ProductRepository<\/div>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 extends JpaRepository&lt;Product, Long&gt; {<\/div>\n<div class=\"scriptor-paragraph\" style=\"padding-left: 80px;\">}<!--ScriptorEndFragment--><\/div>\n\n\n<h5 class=\"wp-block-heading\">In E-Commerce Systems<\/h5>\n\n\n\n<p class=\"wp-block-paragraph\">Instead of a single <code>Payment<\/code> interface containing methods for cards, bank transfers, BLIK, and cryptocurrencies, it is better to create separate interfaces for each payment channel.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A BLIK implementation should not need to know anything about cryptocurrencies.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Memory Trick<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Just as a doctor signs a doctor&#8217;s contract, not an agreement that also requires repairing cars, each specialist should have a contract tailored to their responsibilities.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A well-designed interface describes <strong>one coherent capability<\/strong>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">As a result:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>classes remain honest about what they can do,<\/li>\n\n\n\n<li>contracts remain meaningful,<\/li>\n\n\n\n<li>code becomes more predictable,<\/li>\n\n\n\n<li>systems become easier and safer to extend.<\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Many Small Interfaces Instead of One Large Interface The Interface Segregation Principle (ISP) states that no class should be forced to implement methods that it does not use. \u201cClients should not be forced to depend upon interfaces that they do not use.\u201d \u2014 Robert C. Martin Simply put: Many small, specialized interfaces are better than [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"saved_in_kubio":false,"footnotes":""},"categories":[12],"tags":[],"class_list":["post-417","post","type-post","status-publish","format-standard","hentry","category-solid"],"_links":{"self":[{"href":"https:\/\/patryk-sobilo.profesjonalnyprogramista.pl\/index.php\/wp-json\/wp\/v2\/posts\/417","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/patryk-sobilo.profesjonalnyprogramista.pl\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/patryk-sobilo.profesjonalnyprogramista.pl\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/patryk-sobilo.profesjonalnyprogramista.pl\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/patryk-sobilo.profesjonalnyprogramista.pl\/index.php\/wp-json\/wp\/v2\/comments?post=417"}],"version-history":[{"count":3,"href":"https:\/\/patryk-sobilo.profesjonalnyprogramista.pl\/index.php\/wp-json\/wp\/v2\/posts\/417\/revisions"}],"predecessor-version":[{"id":422,"href":"https:\/\/patryk-sobilo.profesjonalnyprogramista.pl\/index.php\/wp-json\/wp\/v2\/posts\/417\/revisions\/422"}],"wp:attachment":[{"href":"https:\/\/patryk-sobilo.profesjonalnyprogramista.pl\/index.php\/wp-json\/wp\/v2\/media?parent=417"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/patryk-sobilo.profesjonalnyprogramista.pl\/index.php\/wp-json\/wp\/v2\/categories?post=417"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/patryk-sobilo.profesjonalnyprogramista.pl\/index.php\/wp-json\/wp\/v2\/tags?post=417"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}