{"id":34828,"date":"2019-10-31T22:00:38","date_gmt":"2019-10-31T19:00:38","guid":{"rendered":"https:\/\/prohoster.info\/blog\/single-responsibility-principle-ne-takoj-prostoj-kak-kazhetsya\/"},"modified":"2019-10-31T22:00:38","modified_gmt":"2019-10-31T19:00:38","slug":"single-responsibility-principle-ne-takoj-prostoj-kak-kazhetsya","status":"publish","type":"post","link":"https:\/\/prohoster.info\/es\/blog\/news\/single-responsibility-principle-ne-takoj-prostoj-kak-kazhetsya","title":{"rendered":"Principio de Responsabilidad \u00danica. No tan simple como parece","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Principio de Responsabilidad \u00danica. No tan simple como parece\" src=\"\/wp-content\/uploads\/2019\/06\/5b253ff55e3c97b6baf5f7a7ae7f3b98.JPG\" style=\"display:block;margin: 0 auto;\" \/> El principio de responsabilidad \u00fanica, tambi\u00e9n conocido como principio de \u00fanica responsabilidad,<br \/>\ntambi\u00e9n es el principio de \u00fanica variabilidad \u2014 un concepto bastante resbaladizo para entender y una pregunta tan nerviosa en la entrevista de un programador. <\/p>\n<p><\/p>\n<p>Mi primer encuentro serio con este principio ocurri\u00f3 al comienzo de mi primer a\u00f1o, cuando nos llevaron, j\u00f3venes e inexpertos, al bosque, para convertir del estado larval de estudiantes en aut\u00e9nticos estudiantes.<\/p>\n<p><\/p>\n<p>En el bosque, nos dividieron en grupos de 8-9 personas cada uno y organizamos una competencia: \u00bfqu\u00e9 grupo consume m\u00e1s r\u00e1pidamente una botella de vodka bajo la condici\u00f3n de que la primera persona del grupo vierte el vodka en un vaso, la segunda lo bebe y la tercera lo acompa\u00f1a con un aperitivo? El participante que realiza su operaci\u00f3n se coloca al final de la cola del grupo. <\/p>\n<p><\/p>\n<p>El caso en que el tama\u00f1o de la cola es un m\u00faltiplo de tres representa una buena implementaci\u00f3n del SRP.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex> <\/p>\n<h2 id=\"opredelenie-1-edinaya-otvetstvennost\">Definici\u00f3n 1. Responsabilidad \u00fanica.<\/h2>\n<p><\/p>\n<p>La definici\u00f3n oficial del principio de responsabilidad \u00fanica (SRP) afirma que cada objeto tiene su propia responsabilidad y raz\u00f3n de existir y que esta responsabilidad es \u00fanica.<\/p>\n<p><\/p>\n<p>Consideremos el objeto &#171;Bebedor&#187; (<strong>Tippler<\/strong>).<br \/>\nPara cumplir con el principio de SRP, dividimos las responsabilidades entre tres: <\/p>\n<p><\/p>\n<ul>\n<li>Uno vierte (<strong>PourOperation<\/strong>)<\/li>\n<li>Uno bebe (<strong>DrinkUpOperation<\/strong>)<\/li>\n<li>Uno acompa\u00f1a (<strong>TakeBiteOperation<\/strong>)<\/li>\n<\/ul>\n<p><\/p>\n<p>Cada uno de los participantes en el proceso es responsable de un componente del proceso, es decir, tiene una responsabilidad at\u00f3mica: beber, verter o acompa\u00f1ar. <\/p>\n<p><\/p>\n<p>El Bebedor, a su vez, act\u00faa como un fachada para estas operaciones:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">class Tippler {\n    \/\/...\n    void Act(){\n        _pourOperation.Do() \/\/ verter\n        _drinkUpOperation.Do() \/\/ beber\n        _takeBiteOperation.Do() \/\/ acompa\u00f1ar\n    }\n}<\/code><\/pre>\n<p>\n<img decoding=\"async\" alt=\"Principio de Responsabilidad \u00danica. No tan simple como parece\" src=\"\/wp-content\/uploads\/2019\/06\/8d591a474e3555edfee3ffebc28d079b.JPG\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h4 id=\"zachem\">\u00bfPor qu\u00e9?<\/h4>\n<p><\/p>\n<p>El programador humano escribe c\u00f3digo para un humano-mono, y el humano-mono es descuidado, tonto y siempre est\u00e1 apurado. Solo puede mantener y entender alrededor de 3 a 7 t\u00e9rminos en un momento dado.<br \/>\nEn el caso del Bebedor, estos t\u00e9rminos son tres. Sin embargo, si escribimos el c\u00f3digo en una sola hoja, aparecer\u00e1n manos, vasos, peleas y discusiones interminables sobre pol\u00edtica. Y todo esto estar\u00e1 en el cuerpo de un solo m\u00e9todo. Estoy seguro de que has visto este tipo de c\u00f3digo en tu pr\u00e1ctica. No es la prueba m\u00e1s humana para la psique.<\/p>\n<p><\/p>\n<p>Por otro lado, el hombre-mono est\u00e1 dise\u00f1ado para modelar objetos del mundo real en su mente. En su imaginaci\u00f3n, puede chocarlos, ensamblar nuevos objetos a partir de ellos y descomponerlos de la misma manera. Imagina un viejo modelo de coche. Puedes imaginar abrir la puerta, desenroscar el revestimiento de la puerta y ver all\u00ed los mecanismos de los elevacristales, donde habr\u00e1 engranajes. Pero no puedes ver todos los componentes del coche al mismo tiempo, en un &#171;listado&#187;. Al menos, el &#171;hombre-mono&#187; no puede.<\/p>\n<p><\/p>\n<p>Por eso, los programadores descomponen mecanismos complejos en un conjunto de elementos menos complejos y funcionales. Sin embargo, se puede descomponer de diferentes maneras: en muchos coches antiguos, el conducto de aire sale hacia la puerta, y en los modernos, una falla en la electr\u00f3nica de la cerradura impide que el motor arranque, lo que complica la reparaci\u00f3n.<\/p>\n<p><\/p>\n<p>As\u00ed que, <strong>SRP es un principio que explica C\u00d3MO descomponer, es decir, d\u00f3nde trazar la l\u00ednea de separaci\u00f3n.<\/strong>. <\/p>\n<p><\/p>\n<p>\u00c9l dice que hay que descomponer seg\u00fan el principio de separaci\u00f3n de &#171;responsabilidades&#187;, es decir, seg\u00fan las tareas de ciertos objetos.<\/p>\n<p>\n<img decoding=\"async\" alt=\"Principio de Responsabilidad \u00danica. No tan simple como parece\" src=\"\/wp-content\/uploads\/2019\/06\/b1980c3dc9742b921eb818f14fe3527e.JPG\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Volvamos al bebedor y las ventajas que obtiene el hombre-mono al descomponer: <\/p>\n<p><\/p>\n<ul>\n<li>El c\u00f3digo se vuelve absolutamente claro en cada nivel.<\/li>\n<li>Varios programadores pueden escribir c\u00f3digo al mismo tiempo (cada uno escribe un elemento separado).<\/li>\n<li>Se simplifica la prueba automatizada: cuanto m\u00e1s simple es un elemento, m\u00e1s f\u00e1cil es probarlo.<\/li>\n<li>Surge la composicionalidad del c\u00f3digo: se puede reemplazar. <strong>DrinkUpOperation<\/strong> por una operaci\u00f3n en la que el bebedor derrama l\u00edquido bajo la mesa. O reemplazar la operaci\u00f3n de servir por una en la que mezclas vino y agua o vodka y cerveza. Dependiendo de las exigencias del negocio, puedes hacer todo eso sin tocar el c\u00f3digo del m\u00e9todo. <strong>Tippler.Act<\/strong>. <\/li>\n<li>De estas operaciones, puedes formar un glot\u00f3n (usando solo <strong>TakeBitOperation<\/strong>), un alcoh\u00f3lico (usando solo <strong>DrinkUpOperation<\/strong> directamente de la botella) y satisfacer muchos otros requisitos del negocio.<\/li>\n<\/ul>\n<p><\/p>\n<p><em>(Oh, parece que este es ya el principio OCP, y he violado la responsabilidad de esta publicaci\u00f3n.) <\/em><\/p>\n<p><\/p>\n<p>Y, por supuesto, los inconvenientes: <\/p>\n<p><\/p>\n<ul>\n<li>Tendr\u00e1s que crear m\u00e1s tipos. <\/li>\n<li>El bebedor beber\u00e1 por primera vez unas horas m\u00e1s tarde de lo que podr\u00eda.<\/li>\n<\/ul>\n<p><\/p>\n<h2 id=\"opredelenie-2-edinaya-izmenchivost\">Definici\u00f3n 2. Variabilidad \u00fanica.<\/h2>\n<p><\/p>\n<p>\u00a1Perm\u00edtanme, se\u00f1ores! \u00a1La clase del bebedor tambi\u00e9n cumple una \u00fanica responsabilidad: \u00a1beber! Y, en general, la palabra &#171;responsabilidad&#187; es un concepto extremadamente difuso. Alguien es responsable del destino de la humanidad, y alguien es responsable de levantar a los ping\u00fcinos volcando en el polo.<\/p>\n<p><\/p>\n<p>Consideremos dos implementaciones de bebedor. La primera, mencionada anteriormente, contiene tres clases: verter, beber y comer aperitivos.<\/p>\n<p><\/p>\n<p>La segunda, escrita a trav\u00e9s de la metodolog\u00eda &#171;Adelante y solo adelante&#187; y contiene toda la l\u00f3gica en el m\u00e9todo. <strong>Act<\/strong>:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">\/\/\u041d\u0435 \u0442\u0440\u0430\u0442\u044c\u0442\u0435 \u0432\u0440\u0435\u043c\u044f  \u043d\u0430 \u0438\u0437\u0443\u0447\u0435\u043d\u0438\u0435 \u044d\u0442\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430. \u041b\u0443\u0447\u0448\u0435 \u0441\u044a\u0435\u0448\u044c\u0442\u0435 \u043f\u0435\u0447\u0435\u043d\u044c\u043a\u0443\n\u0441lass BrutTippler {\n   \/\/...\n   void Act(){\n        \/\/ \u043d\u0430\u043b\u0438\u0432\u0430\u0435\u043c\n    if(!_hand.TryDischarge(from:_bottle, to:_glass, size:_glass.Capacity))\n        throw new OverdrunkException();\n\n    \/\/ \u0432\u044b\u043f\u0438\u0432\u0430\u0435\u043c\n    if(!_hand.TryDrink(from: _glass,  size: _glass.Capacity))\n        throw new OverdrunkException();\n\n    \/\/\u0417\u0430\u043a\u0443\u0441\u044b\u0432\u0430\u0435\u043c\n    for(int i = 0; i&lt; 3; i++){\n        var food = _foodStore.TakeOrDefault();\n        if(food==null)\n            throw new FoodIsOverException();\n\n        _hand.TryEat(food);\n    }\n   }\n}<\/code><\/pre>\n<p><\/p>\n<p>Ambas clases, desde el punto de vista de un observador externo, parecen absolutamente iguales y cumplen la \u00fanica responsabilidad de &#171;beber&#187;. <\/p>\n<p><\/p>\n<p>\u00a1Confusi\u00f3n!<\/p>\n<p><\/p>\n<p>Entonces, buscamos en internet y descubrimos otra definici\u00f3n de SRP \u2014 Principio de Responsabilidad \u00danica (Single Responsibility Principle).<\/p>\n<p><\/p>\n<p>SCP dice que &#171;<strong>Un m\u00f3dulo tiene una y solo una raz\u00f3n para cambiar<\/strong>&#171;. Es decir, &#171;La responsabilidad es un motivo para el cambio&#187;. <\/p>\n<p><\/p>\n<p><em>(Parece que los chicos que inventaron la definici\u00f3n original estaban seguros de las habilidades telep\u00e1ticas del hombre-mono)<\/em><\/p>\n<p><\/p>\n<p>Ahora todo tiene sentido. Se pueden cambiar por separado los procedimientos de verter, beber y comer aperitivos, y dentro del bebedor solo podemos cambiar el orden y la composici\u00f3n de las operaciones, por ejemplo, moviendo el aperitivo antes de beber o a\u00f1adiendo la lectura de un brindis.<\/p>\n<p><\/p>\n<p>En el enfoque &#171;Adelante y solo adelante&#187;, todo lo que se puede cambiar, se cambia solo en el m\u00e9todo. <strong>Act<\/strong>. Esto puede ser legible y efectivo en un caso donde hay poca l\u00f3gica y raramente cambia, pero a menudo termina con horribles m\u00e9todos de 500 l\u00edneas cada uno, con m\u00e1s ifs de los necesarios para la adhesi\u00f3n de Rusia a la OTAN. <\/p>\n<p><\/p>\n<h2 id=\"opredelenie-3-lokalizaciya-izmeneniy\">Definici\u00f3n 3. Localizaci\u00f3n de cambios.<\/h2>\n<p><\/p>\n<p>Los bebedores a menudo no entienden por qu\u00e9 se despertaron en un apartamento ajeno, o d\u00f3nde est\u00e1 su m\u00f3vil. Es hora de agregar un registro detallado.<\/p>\n<p><\/p>\n<p>Comencemos a registrar el proceso de verter:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">class PourOperation: IOperation{\n    PourOperation(ILogger log \/*....*\/){\/*...*\/}\n    \/\/...\n    void Do(){\n        _log.Log($\"Antes de verter con {_hand} y {_bottle}\");\n        \/\/ L\u00f3gica de negocio de verter ...\n        _log.Log($\"Despu\u00e9s de verter con {_hand} y {_bottle}\");\n    }\n}<\/code><\/pre>\n<p><\/p>\n<p>Incrust\u00e1ndola en <strong>PourOperation<\/strong>, hemos actuado sabiamente en t\u00e9rminos de responsabilidad y encapsulamiento, pero ahora tenemos un dilema con el principio de variabilidad. Adem\u00e1s de la operaci\u00f3n en s\u00ed, que puede cambiar, tambi\u00e9n se vuelve variable el propio registro. Tendremos que dividir y hacer un registrador especial para la operaci\u00f3n de vertido:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">interface IPourLogger{\n    void LogBefore(IHand, IBottle){}\n    void LogAfter(IHand, IBottle){}\n    void OnError(IHand, IBottle, Exception){}\n}\n\nclass PourOperation: IOperation{\n    PourOperation(IPourLogger log \/*....*\/){\/*...*\/}\n    \/\/...\n    void Do(){\n        _log.LogBefore(_hand, _bottle);\n        try{\n             \/\/... l\u00f3gica de negocio\n             _log.LogAfter(_hand, _bottle);\n        }\n        catch(exception e){\n            _log.OnError(_hand, _bottle, e);\n        }\n    }\n}<\/code><\/pre>\n<p><\/p>\n<p>Un lector minucioso notar\u00e1 que <strong>LogAfter<\/strong>, <strong>LogBefore<\/strong> y <strong>OnError<\/strong> tambi\u00e9n pueden cambiarse por separado, y por analog\u00eda con las acciones anteriores, se crear\u00e1n tres clases: <strong>PourLoggerBefore<\/strong>, <strong>PourLoggerAfter<\/strong> y <strong>PourErrorLogger<\/strong>.<\/p>\n<p><\/p>\n<p>Y recordando que hay tres operaciones para el borracho, obtenemos nueve clases de registro. Al final, el borracho consiste en 14 (!!!) clases.<\/p>\n<p><\/p>\n<p>\u00bfHip\u00e9rbole? \u00a1Dif\u00edcilmente! Un hombre-mono con una granada de descomposici\u00f3n descompondr\u00e1 al 'vertedor' en una jarra, un vaso, operadores de vertido, un servicio de suministro de agua, un modelo f\u00edsico de colisi\u00f3n de mol\u00e9culas y en el siguiente trimestre intentar\u00e1 desenredar las dependencias sin variables globales. Y cr\u00e9anme, no se detendr\u00e1.<\/p>\n<p><\/p>\n<p>En este punto, muchos llegan a la conclusi\u00f3n de que SRP son cuentos de hadas de reinos rosados, y se van a hacer ilusiones&#8230;<\/p>\n<p><\/p>\n<p>\u2026sin conocer la existencia de una tercera definici\u00f3n de SRP: <\/p>\n<p><\/p>\n<p>&#171;El principio de responsabilidad \u00fanica dice que <strong>las cosas similares que deben cambiarse deben estar en un solo lugar<\/strong>&#171;. o \u201c<strong>Lo que cambia en conjunto deber\u00eda estar en un solo lugar.<\/strong>\u201d<\/p>\n<p><\/p>\n<p>Es decir, si cambiamos el registro de la operaci\u00f3n, debemos cambiarlo en un solo lugar.<\/p>\n<p><\/p>\n<p>Este es un punto muy importante, ya que todas las explicaciones sobre SRP, que se dieron antes, hablaban de que hay que dividir los tipos hasta que se fracturan, es decir, impon\u00eda una &#171;limitaci\u00f3n superior&#187; al tama\u00f1o del objeto, y ahora hablamos tambi\u00e9n de una &#171;limitaci\u00f3n inferior&#187;. En otras palabras, <strong>SRP no solo requiere &#171;dividir hasta que se fracture&#187;, sino tambi\u00e9n no exagerar: &#171;no fragmentar cosas interconectadas&#187;.<\/strong>. \u00a1Es una gran batalla entre la navaja de Occam y el hombre-mono!<\/p>\n<p>\n<img decoding=\"async\" alt=\"Principio de Responsabilidad \u00danica. No tan simple como parece\" src=\"\/wp-content\/uploads\/2019\/06\/2e349a5b119a511d716341f3f6725844.JPG\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Ahora al borracho deber\u00eda resultarle m\u00e1s f\u00e1cil. Adem\u00e1s de que no es necesario dividir el registrador IPourLogger en tres clases, tambi\u00e9n podemos combinar todos los registradores en un solo tipo:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">class OperationLogger{\n    public OperationLogger(string operationName){\n\/*..*\/}\n    public void LogBefore(object[] args){\n\/*...*\/}\n    public void LogAfter(object[] args){\n\/*..*\/}\n    public void LogError(object[] args, exception e){\n\/*..*\/}\n}<\/code><\/pre>\n<p><\/p>\n<p>Y si nos a\u00f1adimos un cuarto tipo de operaci\u00f3n, ya tenemos la l\u00f3gica de registro lista. Y el c\u00f3digo de las operaciones es limpio y libre de ruido de infraestructura.<\/p>\n<p><\/p>\n<p>Como resultado, tenemos 5 clases para resolver la tarea de consumo:<\/p>\n<p><\/p>\n<ul>\n<li>Operaci\u00f3n de vertido<\/li>\n<li>Operaci\u00f3n de consumo<\/li>\n<li>Operaci\u00f3n de acompa\u00f1amiento<\/li>\n<li>Registrador<\/li>\n<li>Fachada de consumo<\/li>\n<\/ul>\n<p><\/p>\n<p>Cada uno de ellos es responsable estrictamente de una funcionalidad, tiene una sola raz\u00f3n para cambiar. Todas las reglas similares para cambios est\u00e1n juntas. <\/p>\n<p>\n<b class=\"spoiler_title\">Ejemplo de la vida real<\/b><\/p>\n<p>Una vez escribimos un servicio de registro autom\u00e1tico de clientes b2b. Y apareci\u00f3 un m\u00e9todo GOD de 200 l\u00edneas de contenido similar:<\/p>\n<p><\/p>\n<ul>\n<li>Ve a 1C y abre una cuenta<\/li>\n<li>Con esta cuenta ve al m\u00f3dulo de pagos y reg\u00edstrala all\u00ed<\/li>\n<li>Verifica que no haya una cuenta con esa identificaci\u00f3n en el principal <a class=\"wpil_keyword_link\" href=\"https:\/\/prohoster.info\/es\/server\/dts-dronten\/\"   title=\"servidor\" data-wpil-keyword-link=\"linked\"  data-wpil-monitor-id=\"2485\">servidor<\/a><\/li>\n<li>Crea una nueva cuenta<\/li>\n<li>A\u00f1ade el resultado del registro en el m\u00f3dulo de pagos y el n\u00famero 1C al servicio de resultados del registro<\/li>\n<li>A\u00f1ade a esta tabla la informaci\u00f3n sobre la cuenta<\/li>\n<li>Crea un n\u00famero de punto para este cliente en el servicio de puntos. Pasa el n\u00famero de cuenta 1C a este servicio.<\/li>\n<\/ul>\n<p><\/p>\n<p>Y hab\u00eda en esta lista unas diez operaciones comerciales m\u00e1s con una horrible interdependencia. El objeto cuenta era necesario para casi todos. El identificador del punto y el nombre del cliente eran necesarios en la mitad de las llamadas.<\/p>\n<p><\/p>\n<p>Despu\u00e9s de una hora de refactorizaci\u00f3n, pudimos separar el c\u00f3digo de infraestructura y algunos matices del trabajo con la cuenta en m\u00e9todos\/clases separados. El m\u00e9todo God se aliger\u00f3, pero quedaron 100 l\u00edneas de c\u00f3digo que no quer\u00edan desenredarse. <\/p>\n<p><\/p>\n<p>Solo despu\u00e9s de unos d\u00edas lleg\u00f3 la comprensi\u00f3n de que la esencia de este m\u00e9todo &#171;aligerado&#187; es, de hecho, un algoritmo de negocio. Y que la descripci\u00f3n inicial del pliego de condiciones era bastante complicada. Y precisamente el intento de descomponer este m\u00e9todo ser\u00e1 una violaci\u00f3n de SRP, y no al rev\u00e9s. <\/p>\n<p><\/p>\n<h2 id=\"formalizm\">Formalismo.<\/h2>\n<p><\/p>\n<p>Ha llegado el momento de dejar en paz a nuestro consumidor. Seca tus l\u00e1grimas: definitivamente volveremos a \u00e9l en alg\u00fan momento. Ahora vamos a formalizar el conocimiento de este art\u00edculo. <\/p>\n<p><\/p>\n<h4 id=\"formalizm-1-opredelenie-srp\">Formalismo 1. Definici\u00f3n de SRP<\/h4>\n<p><\/p>\n<ol>\n<li>Divide los elementos de tal manera que cada uno de ellos sea responsable de algo \u00fanico.<\/li>\n<li>La responsabilidad se traduce como \u00abmotivo de cambio\u00bb. Es decir, cada elemento tiene solo un motivo para cambiar, en t\u00e9rminos de l\u00f3gica de negocios.<\/li>\n<li>Los cambios potenciales en la l\u00f3gica de negocio deben ser localizados. Los elementos que se modifican de forma sincr\u00f3nica deben estar juntos.<\/li>\n<\/ol>\n<p><\/p>\n<h4 id=\"formalizm-2-neobhodimye-kriterii-samoproverki\">Formalismo 2. Criterios necesarios para la autoevaluaci\u00f3n.<\/h4>\n<p><\/p>\n<p>No he encontrado criterios suficientes para cumplir con el SRP. Pero hay condiciones necesarias:<\/p>\n<p><\/p>\n<p>1) Preg\u00fantese: \u00bfqu\u00e9 hace esta clase\/m\u00e9todo\/m\u00f3dulo\/servicio? Debe poder responder con una definici\u00f3n sencilla. (Gracias) <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/users\/brightori\/\" class=\"user_link\">Brightori<\/a><\/noindex> )<\/p>\n<p>\n<b class=\"spoiler_title\">explicaciones<\/b><\/p>\n<p>Sin embargo, a veces es muy dif\u00edcil encontrar una definici\u00f3n simple. <\/p>\n<p><\/p>\n<p>2) La correcci\u00f3n de un error o la adici\u00f3n de una nueva caracter\u00edstica afecta la menor cantidad de archivos\/clases posible. Idealmente, uno. <\/p>\n<p>\n<b class=\"spoiler_title\">explicaciones<\/b><\/p>\n<p>Dado que la responsabilidad (por la caracter\u00edstica o el error) est\u00e1 encapsulada en un solo archivo\/clase, sabe exactamente d\u00f3nde buscar y qu\u00e9 corregir. Por ejemplo: la funcionalidad de cambiar la salida del registro de operaciones solo requiere modificar el registrador. No es necesario recorrer todo el resto del c\u00f3digo. <\/p>\n<p><\/p>\n<p>Otro ejemplo: agregar un nuevo control UI similar a los anteriores. Si esto le obliga a a\u00f1adir 10 entidades diferentes y 15 convertidores diferentes, parece que ha \u201csobrecargado\u201d.<\/p>\n<p><\/p>\n<p>3) Si varios desarrolladores trabajan en diferentes caracter\u00edsticas de su proyecto, la probabilidad de un conflicto de fusi\u00f3n, es decir, la probabilidad de que un mismo archivo\/clase sea modificado por varios desarrolladores al mismo tiempo, es m\u00ednima.<\/p>\n<p>\n<b class=\"spoiler_title\">explicaciones<\/b><\/p>\n<p>Si al agregar una nueva operaci\u00f3n \u00abVerter vodka bajo la mesa\u00bb necesitas tocar el registrador, la operaci\u00f3n de beber y verter, parece que las responsabilidades est\u00e1n mal distribuidas. Sin duda, esto no siempre es posible, pero hay que intentar reducir este indicador. <\/p>\n<p><\/p>\n<p>4) Al realizar una pregunta aclaratoria sobre la l\u00f3gica de negocio (por parte de un desarrollador o gerente), solo se accede a un archivo\/clase y se obtiene informaci\u00f3n solo de all\u00ed.<\/p>\n<p>\n<b class=\"spoiler_title\">explicaciones<\/b><\/p>\n<p>Las caracter\u00edsticas, reglas o algoritmos est\u00e1n escritos de manera compacta, cada uno en un solo lugar, y no dispersos por todo el c\u00f3digo como banderas.<\/p>\n<p><\/p>\n<p>5) La nomenclatura es comprensible.<\/p>\n<p>\n<b class=\"spoiler_title\">explicaciones<\/b><\/p>\n<p>Nuestra clase o m\u00e9todo es responsable de algo \u00fanico, y la responsabilidad se refleja en su nombre.<\/p>\n<p><\/p>\n<p>AllManagersManagerService \u2014 probablemente, una clase God.<br \/>\nLocalPayment \u2014 probablemente, no. <\/p>\n<p><\/p>\n<h4 id=\"formalizm-3-metodika-razrabotki-okkama-first\">Formalismo 3. Metodolog\u00eda de desarrollo \u00abPrimero lo m\u00e1s simple\u00bb.<\/h4>\n<p><\/p>\n<p>Al comienzo del dise\u00f1o, el hombre-mono no conoce ni siente todas las sutilezas de la tarea que se resuelve y puede cometer errores. Se puede errar de diversas maneras:<\/p>\n<p><\/p>\n<ul>\n<li>Crear objetos demasiado grandes al unir diferentes responsabilidades<\/li>\n<li>Fragmentar, dividiendo una \u00fanica responsabilidad en muchos tipos diferentes<\/li>\n<li>Definir incorrectamente los l\u00edmites de responsabilidad<\/li>\n<\/ul>\n<p><\/p>\n<p>Es importante recordar la regla: \u00abes mejor errar en exceso\u00bb, o \u00absi no est\u00e1s seguro, no dividas\u00bb. Si, por ejemplo, tu clase agrupa dos responsabilidades, sigue siendo comprensible y se puede dividir en dos con un cambio m\u00ednimo en el c\u00f3digo del cliente. Sin embargo, reconstruir un vaso a partir de fragmentos de vidrio suele ser m\u00e1s complicado debido al contexto disperso en varios archivos y la falta de las dependencias necesarias en el c\u00f3digo del cliente. <\/p>\n<p><\/p>\n<h2 id=\"pora-zakruglyatsya\">Es hora de concluir<\/h2>\n<p><\/p>\n<p>El \u00e1mbito de aplicaci\u00f3n de SRP no se limita a OOP y SOLID. Es aplicable a m\u00e9todos, funciones, clases, m\u00f3dulos, microservicios y servicios. Se aplica tanto en desarrollo \u201cfinito\u201d como en \u201cciencia de cohetes\u201d, mejorando el mundo en todos lados. Si lo piensas, es quiz\u00e1s un principio fundamental de toda la ingenier\u00eda. La ingenier\u00eda mec\u00e1nica, los sistemas de control, y en general, todos los sistemas complejos, se construyen a partir de componentes, y la \"no fragmentaci\u00f3n\" priva a los dise\u00f1adores de flexibilidad, la \"fragmentaci\u00f3n\" de eficiencia, y los l\u00edmites incorrectos de razonamiento y paz mental. <\/p>\n<p>\n<img decoding=\"async\" alt=\"Principio de Responsabilidad \u00danica. No tan simple como parece\" src=\"\/wp-content\/uploads\/2019\/06\/b70fb2b0b87cf90d41462263e839902b.JPG\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>SRP no est\u00e1 inventado por la naturaleza ni es parte de una ciencia exacta. Surge de nuestras limitaciones biol\u00f3gicas y psicol\u00f3gicas. Es simplemente un modo de controlar y desarrollar sistemas complejos utilizando el cerebro humano primate. Nos indica c\u00f3mo descomponer un sistema. La formulaci\u00f3n original requer\u00eda considerable habilidad telep\u00e1tica, pero espero que este art\u00edculo haya despejado un poco la cortina de humo.<\/p>\n<p>Fuente: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/454290\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>Single responsibility principle, \u043e\u043d \u0436\u0435 \u043f\u0440\u0438\u043d\u0446\u0438\u043f \u0435\u0434\u0438\u043d\u043e\u0439 \u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0441\u0442\u0438, \u043e\u043d \u0436\u0435 \u043f\u0440\u0438\u043d\u0446\u0438\u043f \u0435\u0434\u0438\u043d\u043e\u0439 \u0438\u0437\u043c\u0435\u043d\u0447\u0438\u0432\u043e\u0441\u0442\u0438 \u2014 \u043a\u0440\u0430\u0439\u043d\u0435 \u0441\u043a\u043e\u043b\u044c\u0437\u043a\u0438\u0439 \u0434\u043b\u044f \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u044f \u043f\u0430\u0440\u0435\u043d\u044c \u0438 \u0441\u0442\u043e\u043b\u044c \u043d\u0435\u0440\u0432\u043e\u0437\u043d\u044b\u0439 \u0432\u043e\u043f\u0440\u043e\u0441 \u043d\u0430 \u0441\u043e\u0431\u0435\u0441\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u0430. \u041f\u0435\u0440\u0432\u043e\u0435 \u0441\u0435\u0440\u044c\u0435\u0437\u043d\u043e\u0435 \u0437\u043d\u0430\u043a\u043e\u043c\u0441\u0442\u0432\u043e \u0441 \u044d\u0442\u0438\u043c \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u043e\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043b\u043e\u0441\u044c \u0434\u043b\u044f \u043c\u0435\u043d\u044f \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u043a\u0443\u0440\u0441\u0430, \u043a\u043e\u0433\u0434\u0430 \u043c\u043e\u043b\u043e\u0434\u044b\u0445 \u0438 \u0437\u0435\u043b\u0435\u043d\u044b\u0445 \u043d\u0430\u0441 \u0432\u044b\u0432\u0435\u0437\u043b\u0438 \u0432 \u043b\u0435\u0441, \u0447\u0442\u043e\u0431\u044b \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0438\u0437 \u043b\u0438\u0447\u0438\u043d\u043e\u043a \u0441\u0442\u0443\u0434\u0435\u043d\u0442\u043e\u0432 \u2014 \u0441\u0442\u0443\u0434\u0435\u043d\u0442\u043e\u0432 \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0438\u0445. [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":26229,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[702],"tags":[],"class_list":["post-34828","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-news"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.2 - aioseo.com -->\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/es\/blog\/news\/single-responsibility-principle-ne-takoj-prostoj-kak-kazhetsya\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2\" \/>\n\t\t<meta property=\"og:locale\" content=\"es_ES\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47Single Responsibility Principle. \u041d\u0435 \u0442\u0430\u043a\u043e\u0439 \u043f\u0440\u043e\u0441\u0442\u043e\u0439, \u043a\u0430\u043a \u043a\u0430\u0436\u0435\u0442\u0441\u044f | ProHoster\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/es\/blog\/news\/single-responsibility-principle-ne-takoj-prostoj-kak-kazhetsya\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2019-10-31T19:00:38+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2019-10-31T19:00:38+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Principio de Responsabilidad \u00danica. No tan simple como parece | ProHoster","description":"","canonical_url":"https:\/\/prohoster.info\/es\/blog\/news\/single-responsibility-principle-ne-takoj-prostoj-kak-kazhetsya","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"es_ES","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47Single Responsibility Principle. \u041d\u0435 \u0442\u0430\u043a\u043e\u0439 \u043f\u0440\u043e\u0441\u0442\u043e\u0439, \u043a\u0430\u043a \u043a\u0430\u0436\u0435\u0442\u0441\u044f | ProHoster","og:url":"https:\/\/prohoster.info\/es\/blog\/news\/single-responsibility-principle-ne-takoj-prostoj-kak-kazhetsya","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2019-10-31T19:00:38+00:00","article:modified_time":"2019-10-31T19:00:38+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"34828","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":"2026-02-09 21:46:19","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-03-01 02:14:06","updated":"2026-02-09 21:46:19","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/posts\/34828","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/comments?post=34828"}],"version-history":[{"count":1,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/posts\/34828\/revisions"}],"predecessor-version":[{"id":159767,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/posts\/34828\/revisions\/159767"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/media\/26229"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/media?parent=34828"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/categories?post=34828"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/tags?post=34828"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}