Principios SOLID en React.js (Buenas prácticas) con ejemplos prácticos

midulive
29 Jul 202255:55

Summary

TLDRThis video script delves into the five principles of SOLID (Single Responsibility, Open/Closed, Liskov Substitution, Interface Segregation, and Dependency Inversion) within the context of React. Through practical examples and code implementations, it explores how adhering to these principles can lead to more maintainable, extensible, and flexible code. The instructor guides viewers through refactoring components, separating concerns, and applying techniques like abstractions and dependency injection to achieve better code organization, reusability, and modularity.

Takeaways

  • ๐ SOLID principles were originally designed for object-oriented programming but are also applicable to functional programming and component-based architectures like React.
  • ๐ฆ The Single Responsibility Principle states that each class, component, or function should have only one responsibility or purpose.
  • ๐ The Open/Closed Principle dictates that software entities should be open for extension but closed for modification, promoting code reusability and avoiding breaking changes.
  • ๐ The Liskov Substitution Principle ensures that subtypes must be substitutable for their base types without altering the correctness of the program.
  • ๐ฆ The Interface Segregation Principle recommends that clients should not be forced to depend on interfaces they do not use, promoting modular and loosely coupled designs.
  • ๐ฆ The Dependency Inversion Principle states that high-level modules should not depend on low-level modules; both should depend on abstractions, promoting decoupling and easier refactoring.
  • ๐ Adhering to SOLID principles can improve code maintainability, extensibility, and testability in React applications.
  • ๐คนโ It's essential to strike a balance when applying SOLID principles, as taking them to the extreme can sometimes lead to over-engineering and complexity.
  • ๐ฌ Effective communication and context are crucial when discussing and implementing SOLID principles within a team or codebase.
  • ๐ง Continuous learning, practice, and adapting SOLID principles to specific use cases are necessary for mastering their application in React development.

Q & A

  • What are the SOLID principles in React?

    -The SOLID principles are a set of guidelines for writing maintainable, scalable, and flexible code in object-oriented programming. While originally intended for OOP, these principles can be applied to other paradigms, including React. The SOLID principles are: Single Responsibility Principle, Open/Closed Principle, Liskov Substitution Principle, Interface Segregation Principle, and Dependency Inversion Principle.

  • Can you explain the Single Responsibility Principle with an example in React?

    -The Single Responsibility Principle states that a class or component should have only one reason to change. In React, this means that a component should have a single, well-defined responsibility. For example, separating the data fetching logic from the rendering logic into separate components or custom hooks can help adhere to this principle.

  • What is the Open/Closed Principle, and how can it be applied in React?

    -The Open/Closed Principle states that software entities (classes, modules, functions, etc.) should be open for extension but closed for modification. In React, this can be achieved by using composition and rendering different components based on props or state, rather than modifying the existing component's behavior.

  • Can you give an example of the Liskov Substitution Principle in React?

    -The Liskov Substitution Principle states that subtypes should be substitutable for their base types without altering the correctness of the program. In React, this principle can be applied by ensuring that child components adhere to the same contract as their parent components, and can be used interchangeably without breaking the application.

  • What is the Interface Segregation Principle, and how is it relevant in React?

    -The Interface Segregation Principle states that clients should not be forced to depend on interfaces they do not use. In React, this can be achieved by breaking down large components into smaller, more focused components that receive only the props they need, rather than passing unnecessary data down the component tree.

  • Can you explain the Dependency Inversion Principle and its importance in React?

    -The Dependency Inversion Principle states that high-level modules should not depend on low-level modules; both should depend on abstractions. In React, this can be achieved by using dependency injection and creating abstractions (e.g., hooks or services) that decouple components from specific implementations, making the code more modular and testable.

  • How can the SOLID principles improve code maintainability and scalability in React applications?

    -Following the SOLID principles in React applications can improve code maintainability and scalability by promoting modular design, loose coupling, and separation of concerns. This makes it easier to understand, modify, and extend the codebase without introducing unintended side effects or breaking existing functionality.

  • Can you provide an example of how the Dependency Inversion Principle can be applied using React hooks?

    -Certainly. The Dependency Inversion Principle can be applied in React hooks by creating custom hooks that abstract away implementation details and can be injected into components as dependencies. For example, you could create a custom hook for data fetching that can be injected into different components, decoupling them from the specific implementation of the data fetching logic.

  • How can the Open/Closed Principle be applied when working with React component libraries?

    -When working with React component libraries, the Open/Closed Principle can be applied by designing components that are extensible through composition and props. For example, a library could provide a base component that can be extended by wrapping it with additional functionality or rendering custom content within it, rather than modifying the base component directly.

  • Can you discuss the trade-offs between following the SOLID principles strictly and pragmatism in React development?

    -While following the SOLID principles can lead to more maintainable and scalable code, strictly adhering to them can sometimes introduce unnecessary complexity or overhead. Pragmatism is important in React development, and it's often necessary to find a balance between following best practices and keeping the codebase simple and readable. The key is to understand the principles and apply them judiciously, considering the specific requirements and constraints of the project.

Outlines

00:00

🔵 Introduction to SOLID Principles in React

This paragraph introduces the SOLID principles and their relevance in React development. It explains that SOLID is an acronym representing five principles for object-oriented programming design, but these principles can be applied to various software design paradigms, including functional programming and component-based architectures like React. The speaker plans to refactor examples for each principle and discuss their application in React.

05:01

🟢 Single Responsibility Principle

This paragraph focuses on the Single Responsibility Principle (SRP). It states that a class should have a single responsibility, and this concept can be extended to React components. The speaker demonstrates a component that violates SRP by handling state management, data fetching, and rendering logic. They refactor the component by extracting the data fetching logic into a custom hook, separating concerns and responsibilities. The paragraph emphasizes the importance of keeping components focused on a single responsibility for maintainability and reusability.

10:03

🟠 Continuing Single Responsibility Principle

This paragraph continues the discussion on the Single Responsibility Principle (SRP). It explores further refactoring opportunities by separating the state management and data fetching responsibilities into separate functions or services. The speaker emphasizes that while adhering to SRP is beneficial, taking it to extremes can lead to over-engineering and complexity. The key is finding the right balance based on the project's context and requirements.

15:06

🟣 Open/Closed Principle

This paragraph introduces the Open/Closed Principle (OCP), which states that software entities should be open for extension but closed for modification. In the context of React, the speaker provides an example of a component that violates OCP by requiring modifications to handle different types of components. They refactor the component using the composition pattern and the children prop, allowing the component to be extended without modifying its internal logic. The paragraph highlights the importance of designing components that can be extended from the outside rather than modified internally.

20:07

🔴 Continuing Open/Closed Principle

This paragraph continues the discussion on the Open/Closed Principle (OCP) and the refactoring of the example component. It introduces the concept of component slots, which allows for further extensibility and customization of the component's rendering logic. The speaker emphasizes the importance of finding the right balance between extensibility and complexity, as excessive adherence to OCP can lead to over-engineering.

25:08

🟢 Liskov Substitution Principle

This paragraph covers the Liskov Substitution Principle (LSP), which states that subtypes should be substitutable for their base types without altering the correctness of the program. The speaker provides an example of a button component that violates LSP by introducing incompatible properties or behaviors. They refactor the component to ensure that child components inherit and extend the base component's behavior without breaking the contract. The paragraph highlights the importance of designing components that can be substituted for their base types without causing any issues.

30:09

🟠 Continuing Liskov Substitution Principle

This paragraph continues the discussion on the Liskov Substitution Principle (LSP) and the refactored button component example. It explores the notion of subtypes and base types in the context of React components, emphasizing the importance of maintaining compatibility and substitutability between them. The paragraph also touches on the trade-offs and considerations when adhering to LSP, as taking it to extremes can lead to unnecessary complexity.

35:09

🟣 Interface Segregation Principle

This paragraph introduces the Interface Segregation Principle (ISP), which states that clients should not be forced to depend on interfaces they do not use. The speaker provides examples of components that violate ISP by receiving excessive props or data structures that they do not necessarily need. They refactor the components by extracting only the required props or data, minimizing dependencies and improving testability. The paragraph emphasizes the importance of designing focused and modular interfaces to avoid unnecessary coupling and complexity.

40:11

🔴 Continuing Interface Segregation Principle

This paragraph continues the discussion on the Interface Segregation Principle (ISP) and the refactoring examples. It explores additional scenarios where components might receive or pass unnecessary data, leading to potential performance issues or false assumptions about immutability. The speaker highlights the trade-offs and considerations when adhering to ISP, as excessive adherence can lead to over-engineering or complexity. The key is finding the right balance based on the project's context and requirements.

45:11

🟢 Dependency Inversion Principle

This paragraph introduces the Dependency Inversion Principle (DIP), which states that high-level modules should not depend on low-level modules; instead, both should depend on abstractions. The speaker provides an example of a component that depends on a specific implementation (SWR) for data fetching. They refactor the component by introducing an abstraction layer that decouples the data fetching logic from the implementation details. This allows the component to depend on an abstraction instead of a concrete implementation, promoting flexibility and maintainability.

50:13

🟠 Continuing Dependency Inversion Principle

This paragraph continues the discussion on the Dependency Inversion Principle (DIP) and the refactoring example. It explores the concept of dependency injection, where different implementations of the data fetching abstraction can be injected into the component without modifying its internal logic. The speaker demonstrates how this approach promotes flexibility, testability, and separation of concerns, as the component remains unaware of the specific implementation details for data fetching.

55:13

🟣 Dependency Inversion Principle Example

This paragraph provides an additional example to further illustrate the Dependency Inversion Principle (DIP) and dependency injection. It demonstrates how different implementations of the data fetching abstraction can be injected, such as fetching from an API, local storage, or a global context. The speaker highlights the power and flexibility of this approach, as components remain agnostic to the data source implementation details, promoting loose coupling and ease of maintenance.

Mindmap

Keywords

💡Single Responsibility Principle

The Single Responsibility Principle states that a class or component should have only one reason to change, or in other words, should have a single responsibility. In the context of the video, this principle is applied to React components, suggesting that each component should have a single, well-defined responsibility. The video illustrates this by refactoring an example component that initially had multiple responsibilities, such as managing state, fetching data, and rendering, into separate hooks or smaller components, each with a single responsibility.

💡Open/Closed Principle

The Open/Closed Principle states that software entities (classes, modules, components, etc.) should be open for extension but closed for modification. In the context of React, this principle is demonstrated by creating a `Title` component that can be extended by passing different children components (e.g., `TitleWithLink`, `TitleWithButton`) instead of modifying the original `Title` component to handle different cases. By following this principle, new functionality can be added without modifying the existing code, making it more maintainable and less prone to introducing bugs.

💡Liskov Substitution Principle

The Liskov Substitution Principle states that objects of a superclass should be replaceable with objects of a subclass without affecting the correctness of the program. In the context of React, this principle is illustrated with an example of a `Button` component that receives props like `size` and `color`. The video demonstrates how violating this principle can lead to issues where a subcomponent (e.g., `RedButton`) breaks the expected behavior when substituted for the base component (`Button`). By adhering to this principle, components can be more easily extended or replaced without breaking existing functionality.

💡Interface Segregation Principle

The Interface Segregation Principle states that clients should not be forced to depend on interfaces they do not use. In the context of React, this principle is illustrated by an example where a component receives unnecessary props or data that it does not need. The video demonstrates how refactoring the component to receive only the required props or data can make the component more maintainable, testable, and easier to understand. By following this principle, components become more modular and decoupled, reducing the risk of unintended side effects when changes are made.

💡Dependency Inversion Principle

The Dependency Inversion Principle states that high-level modules should not depend on low-level modules; both should depend on abstractions. In the context of React, this principle is demonstrated by creating an abstraction layer for fetching data, allowing components to depend on this abstraction instead of depending directly on a specific implementation (e.g., a specific API or data source). The video illustrates how this abstraction can be injected or swapped out, enabling components to remain agnostic to the underlying data fetching implementation, making the codebase more flexible and maintainable.

💡Refactoring

Refactoring refers to the process of restructuring existing code without changing its external behavior. In the context of the video, refactoring is a recurring theme, as the instructor demonstrates how to apply the SOLID principles by refactoring example React components. Refactoring is presented as a way to improve code quality, maintainability, and adherence to best practices, while preserving the original functionality of the components.

💡React Components

React components are the building blocks of React applications. In the video, React components are used as the primary context for illustrating and applying the SOLID principles. The instructor demonstrates how components can be refactored to adhere to principles like the Single Responsibility Principle, Open/Closed Principle, and Interface Segregation Principle, leading to more modular, maintainable, and extensible components.

💡Hooks

Hooks are functions introduced in React 16.8 that allow developers to use state and other React features without writing a class component. In the video, hooks are presented as a way to separate concerns and responsibilities within components, adhering to the Single Responsibility Principle. The instructor demonstrates how custom hooks can be created to encapsulate specific behaviors or functionality, making components more modular and easier to maintain.

💡Abstraction

Abstraction is the process of hiding complex implementation details and exposing only the essential features or behavior of a system or component. In the context of the video, abstraction is demonstrated when creating an abstraction layer for fetching data, allowing components to depend on this abstraction instead of a specific implementation. This adherence to the Dependency Inversion Principle promotes code flexibility, maintainability, and the ability to swap out implementations without affecting dependent components.

💡Modularity

Modularity refers to the principle of dividing a software system into smaller, independent, and interchangeable modules or components. Throughout the video, the instructor emphasizes the importance of modularity in React applications, as it aligns with the SOLID principles and promotes code reusability, maintainability, and testability. By refactoring components into smaller, more focused modules with single responsibilities, the codebase becomes more modular and easier to reason about.

Highlights

The SOLID principles are a set of design principles for object-oriented programming, but they can also be applied to other paradigms like functional programming and component-based architectures like React.

The Single Responsibility Principle states that a class or component should have only one reason to change, i.e., it should have a single responsibility.

The Open/Closed Principle states that software entities (classes, modules, components, etc.) should be open for extension but closed for modification.

The Liskov Substitution Principle states that objects of a superclass should be replaceable with objects of a subclass without affecting the correctness of the program.

The Interface Segregation Principle states that clients should not be forced to depend on interfaces they do not use.

The Dependency Inversion Principle states that high-level modules should not depend on low-level modules; both should depend on abstractions.

In React, the Single Responsibility Principle can be applied by separating concerns into different components or custom hooks.

The Open/Closed Principle in React can be achieved by using composition and children props to extend component functionality instead of modifying the component's internal implementation.

The Liskov Substitution Principle in React can be applied by ensuring that components that extend or specialize other components maintain a consistent interface and behavior.

The Interface Segregation Principle in React can be applied by minimizing the number of props a component receives, passing only the necessary data and abstractions.

The Dependency Inversion Principle in React can be achieved by depending on abstractions (e.g., interfaces, higher-order components, render props) instead of concrete implementations.

Applying SOLID principles in React can improve code maintainability, extensibility, and testability by promoting modular and decoupled components.

The context is important when applying SOLID principles; sometimes, taking a principle to the extreme can be counterproductive and increase complexity.

Dependency injection in React can be achieved by creating abstraction layers and injecting dependencies (e.g., data fetching, state management) into components, allowing for easier testability and flexibility.

The SOLID principles should be balanced with pragmatism and the specific context of the project, as blindly following them can sometimes lead to over-engineering and unnecessary complexity.

Transcripts

play00:00

a playa sol y principles en react que es

play00:02

solita antes de que empecemos vamos a

play00:04

seguir un poco la guía del artículo pero

play00:06

yo tengo aquí unos ejemplos que he ido

play00:07

encontrando y que lo que voy a hacer es

play00:09

re factorizar los hay aquí ejemplos en

play00:12

cada uno de los ejemplos tenemos esto es

play00:14

la inversión de dependencias liskov open

play00:16

close principle single dispositivo y de

play00:18

cada uno tenga un código de ria que lo

play00:20

que vamos a hacer es re factorizar lo

play00:22

que es solid sol y como hemos dicho es

play00:24

un acrónimo vale es un acrónimo donde

play00:26

cada letra representa un principio a la

play00:30

hora de diseñar con programación

play00:32

orientada a objetos hay que tener en

play00:33

cuenta que aunque estuviese pensado en

play00:35

su día estos principios para la

play00:37

programación orientada a objetos lo

play00:39

cierto es que se ha podido llevar a un

play00:41

montón de otro tipo de diseño de

play00:43

software sea programación funcional ya

play00:45

sea en componente componentes acción con

play00:47

ría con view con lo que tú quieras se

play00:49

puede llevar al menos los principios no

play00:52

de la forma más pura porque hay veces

play00:53

que hablan literalmente de clases pero

play00:55

sí que es verdad que muchas veces lo

play00:57

puedes adaptar más o menos vale entonces

play00:59

los cinco principios single

play01:01

responsibility principal open close

play01:03

principal listos sustitución interface

play01:05

gration y dependencia inversión estos

play01:07

son los cinco principios vamos a ver

play01:09

cada uno de los principios que

play01:10

significan y cómo los podemos llevar un

play01:12

poquito al terreno de rayak así que

play01:14

empezamos con el primero que se les 5

play01:17

responsibility principle este la

play01:20

definición original es que cada clase

play01:22

tiene que tener una sola responsabilidad

play01:24

como os digo esto estaba pensado para la

play01:26

programación orientada a objetos y por

play01:27

lo tanto hablaba mucho de clases oa

play01:29

veces incluso de módulos y lo que quiere

play01:31

decir es que hay veces que tienes una

play01:32

clase que hace demasiadas cosas por

play01:34

ejemplo puedes tener la clase y usher

play01:36

pero claro en la casa usher que se ocupe

play01:38

de abrir cuentas de cambiar toda la

play01:42

información de la dirección del usuario

play01:44

tienes demasiadas cosas al final lo que

play01:46

quieres hacer es simplificar al máximo

play01:48

las clases y que simplemente hagan una

play01:50

sola cosa porque porque si no lo que va

play01:52

a pasar es que cuando lo quieran

play01:53

modificar o lo quedas cambiar te va a

play01:55

costar mucho eso lo puedes ver también

play01:58

un poco con con el tema de los

play01:59

componentes si haces un componente que

play02:01

haga más de una cosa que tenga más de

play02:02

una responsabilidad y vamos a ver lo

play02:04

fácil que es que tenga más de una

play02:05

responsabilidad y te vas a ver reflejado

play02:07

como yo me veo reflejado muchas veces

play02:09

vas a ver que es muy fácil que esto te

play02:10

ocurra el hecho de que un componente

play02:12

haga demasiado una y te quiero dar de

play02:14

contexto es que hay gente que considera

play02:15

que el single responsability principal

play02:17

no habla tanto del código o de las

play02:20

clases sino que habla más de la uner si

play02:23

yo no estoy muy de acuerdo vale yo no

play02:25

estoy muy de acuerdo aunque hay gente

play02:27

que por ejemplo robert si martín también

play02:29

habla de esto de los stakeholders de que

play02:31

una clase o esa parte del código tenía

play02:34

que tener como un solo un solo

play02:36

stakeholder un solo dueño sabes era un

play02:39

poquito más así entiéndelo como quieras

play02:40

solo te doy esa definición de que hay

play02:42

gente que la defiende un poquito de esa

play02:43

manera pero yo prefiero verla un poco

play02:46

por el código porque creo que tiene

play02:47

sentido creo que en riad tiene sentido y

play02:49

al final creo que ya va escribir

play02:50

cualquier cosa tiene sentido y el

play02:52

ejemplo de ría que es muy potente porque

play02:54

muchas veces

play02:54

justamente lo hacemos más vale que es

play02:57

una responsabilidad hombre verde y coca

play02:58

en responsabilidad eso es una palabra

play03:01

literal en general la responsabilidad

play03:03

como si una persona tuviera muchas

play03:04

responsabilidades imagínate que en un

play03:06

trabajo una persona no sólo tuviese que

play03:09

programar sino además tuviese que

play03:10

diseñar y además tuviese que hacer la

play03:12

comida y además también tuviese que

play03:14

hacer todas las reuniones eso es una

play03:15

responsabilidad el hecho de que muchas

play03:17

tareas

play03:18

que te corresponde a hacer demasiadas

play03:20

cosas una responsabilidad es lo que te

play03:22

corresponde hacer lo que ya sea por tu

play03:25

estatus por tu puesto por la vida es lo

play03:28

que tendrías que hacer y en el tema la

play03:30

programación es los dotes que le estás

play03:33

dando a una clase o una función cuántas

play03:35

cosas tiene que hacer un componente lo

play03:37

vamos a ver si un serían como freelance

play03:38

eso no es verdad eso está bastante buena

play03:41

mira también este este artículo está muy

play03:43

chulo que es él es sólo y principal sin

play03:45

pictures así que bueno lo podemos pero

play03:47

también gracias por compartirlo equipan

play03:48

una single responsability vale esto es

play03:51

una híper simplificación una clase tiene

play03:53

que tener una sola responsabilidad pero

play03:54

bueno pensad justamente no sólo en

play03:56

clases sino en componentes en funciones

play03:58

lo que sea pero aquí tenemos un robot

play04:00

que tiene demasiadas responsabilidades

play04:01

porque es el cocinero es el jardinero es

play04:04

el que pinta es el conductor y en cambio

play04:06

para evitar esto lo que tenemos que

play04:08

hacer es separarlos en diferentes para

play04:11

que cada uno cada parte cada clase cada

play04:13

función cada componente tenga o cada

play04:15

robot tenga una sola responsabilidad

play04:16

vale ese sería principio sin

play04:18

responsibility tenemos un robot que es

play04:20

el cocinero es un robot que es el

play04:22

jardinero un robot que es el que pinta

play04:25

qué es el crimen tuit bueno entonces al

play04:27

final lo que tienes que hacer es que

play04:29

cada uno tenga una sola responsabilidad

play04:30

vamos a ver un ejemplo en react vale

play04:32

esto es un proyecto que he hecho con

play04:34

beat tiene type script pero no os

play04:36

preocupéis porque nos casi no se utiliza

play04:38

y lo poco se utiliza lo vais a entender

play04:39

súper fácil tengo una carpeta para cada

play04:42

uno de estos principios y vamos a ver un

play04:44

código por ejemplo este no en este

play04:46

código tenemos el de single

play04:48

responsability principal y vamos a ver

play04:50

cómo lo podríamos hacer bien y os voy a

play04:53

explicar por qué estaría mal porque

play04:54

incumple la el principio de single

play04:57

responsibility y cómo lo podemos mejorar

play04:59

entonces voy a ponerlo aquí el tema es

play05:01

el principio más complicado porque como

play05:03

sabes que tienes una sola

play05:03

responsabilidad y aquí nivel claro como

play05:05

os he dicho antes las los principios no

play05:08

es un un switch no es un interruptor

play05:09

sino que muchas veces es un tema de

play05:11

intensidad y hasta dónde quieres llegar

play05:13

con la madriguera del conejo de cada

play05:15

principio al final hay que tener cuidado

play05:16

porque si te pasas en los principios

play05:19

solid tenemos el single responsibility

play05:21

de responsabilidad única y en react

play05:24

tendríamos este componente vale y os voy

play05:26

a decir qué es lo que vemos mal yo lo

play05:28

que vería mal en este componente lo que

play05:30

podemos ver bueno parece al principio

play05:31

que viene tenéis yusef news state parece

play05:34

que todo bien aquí tiene un tipo para ti

play05:37

para el contrato de lo que se guarda en

play05:40

el estado pero aquí empiezan un poquito

play05:42

los problemas el tema es que este

play05:44

componente tiene diferentes

play05:46

responsabilidades tiene la

play05:47

responsabilidad de gestionar el estado

play05:49

tiene la responsabilidad de hacer el

play05:51

phising de datos vale tienes que hacer

play05:53

el juz effect tienes la responsabilidad

play05:55

de saber cómo haces el festín de datos y

play05:57

finalmente tiene la responsabilidad de

play05:59

renderizar el contenido por lo tanto

play06:01

tiene demasiadas responsabilidades y

play06:03

esto obviamente lo podemos mejorar y lo

play06:05

vamos a hacer como podríamos mejorar

play06:07

esto siempre a ver esta es una

play06:09

generalización pero es una

play06:10

generalización que al menos podéis tener

play06:12

en cuenta normalmente en un componente

play06:14

de riac si tienes un yusef ect

play06:17

significa que puedes crear un casting

play06:19

hook para evitar tests así que qué es lo

play06:21

primero que yo os haría yo lo primero

play06:23

que haría sería crear un casting que sea

play06:26

todo vale vamos a crear un casto hub y

play06:28

este caso lo que vamos a hacer es

play06:30

extraer primero yo extra haría todo lo

play06:33

que no necesitamos dentro del componente

play06:35

así que yo esto lo metería por aquí voy

play06:37

a hacer una cosa antes todo esto vamos a

play06:39

hacer una cosita para asegurarme que

play06:41

está funcionando lo que estamos haciendo

play06:42

justamente en el ts xv es que yo estoy

play06:45

realizando ya todos los componentes así

play06:47

que voy a comentar lo que no necesitamos

play06:49

ahora vamos a ver en la local host 3000

play06:52

vale aquí ya tenemos este sería el

play06:53

componente que está reutilizando es una

play06:55

lista como de 'todos' o sea que parece

play06:57

que funciona funciona entonces vamos a

play06:58

refactorización pero que asegurándonos

play07:00

que funciona hubiera gustado hacer tests

play07:02

hubiera sido genial porque a la hora de

play07:03

autorizar los tests son muy chulos pero

play07:06

en este caso no va o tiempo imposible el

play07:08

día que me dedique sólo al contenido

play07:09

aparte de hacer shorts de 15 segundos le

play07:13

daremos cañita mal entonces en este

play07:15

ejemplo lo que podemos hacer extraer en

play07:17

un cartón hub y esto ahora lo vamos a

play07:19

quitar de aquí vale ya no necesitamos

play07:21

que significa pues que ahora fíjate cómo

play07:23

se simplifica sólo con esto sólo con

play07:26

esto a buenas prácticas que tenemos que

play07:27

devolver podríamos devolver el de hita

play07:30

el de italia vamos a dar a todo vale y

play07:33

ya está vamos a hacer esto vamos a

play07:35

devolver un objeto que sea to do is

play07:37

facing para saber si está haciendo fecha

play07:38

el tubo le va a ser el que reciba el

play07:41

data o que le ponemos a que poner todo

play07:43

vale y set tools

play07:45

vamos a poner y así quedará mejor todo

play07:49

vale y éste 'todos' sería el que de

play07:50

volveríamos aquí al papá papá y ahora

play07:53

esto quedaría así de fácil sus fechas

play07:56

todo y simplemente haríamos esto ahora

play07:58

lo que bueno esto sería todo y aquí ya

play08:02

estaría con este ejemplo con esto que

play08:04

parece tan tonto en realidad ya hemos

play08:06

simplificado bastante el componente lo

play08:08

que estamos haciendo es un casto niuk

play08:09

que sería esto de aquí donde hemos

play08:11

extraído parte de la responsabilidad que

play08:14

tenía nuestro componente ahora nuestro

play08:15

componente su responsabilidad es sólo

play08:18

renderizar los datos es lo único que

play08:21

tiene que pensar esto es un error

play08:22

bastante común en el que mucha gente

play08:24

mete todo el phising de datos dentro de

play08:27

sus componentes esto además de que hace

play08:29

que sea cero reutilizable porque al

play08:31

final ese componente está totalmente

play08:33

como atado pues lo que estamos haciendo

play08:36

es separar la responsabilidad de ese

play08:38

componente a un gasto que es lo que

play08:40

hacen esos los dos estados del casto

play08:42

bueno en este estamos guardando y

play08:44

guardando los datos del festval y esto

play08:47

sería para saber si

play08:49

si está cargando y así cuando está

play08:51

cargando podríamos hacer un reto esto

play08:53

sería lo que estaría haciendo ya está

play08:55

una vez que hemos hecho esto yo lo

play08:56

llevaría más allá por ejemplo en lugar

play08:58

de dejarlo todo en un mismo componente

play09:00

lo interesante lo que podemos hacer

play09:02

sería por ejemplo crear hay gente aquí

play09:05

que crean books books sería your face to

play09:09

to y es totalmente válido vale no os

play09:12

preocupéis no pasa nada esto está esto

play09:14

está bien esto correcto vale aquí lo que

play09:16

deberíamos hacer es importar todo esto y

play09:19

entonces ya todavía lo estaríamos

play09:21

separando todavía mejor porque porque

play09:24

ahora nuestro componente fíjate que ni

play09:27

siquiera estamos viendo yusef esto ni

play09:31

siquiera estamos viendo ningún importe

play09:32

de axios ningún tipo de importe vale

play09:34

ningún tipo de importe swr lo veremos

play09:37

después vale veremos un ejemplo con swr

play09:39

y porque tiene interesante y porque es

play09:41

interesante swr y cómo hacer inyección

play09:44

de dependencias y todo esto

play09:46

y cuál sería parecida swr ya están

play09:49

entonces ya veis cómo ha quedado el

play09:50

componente súper limpio súper fácil de

play09:53

entender lo puede utilizar cualquiera

play09:54

aquí lo que hemos separado es toda la

play09:56

lógica y aquí tenemos que todo sigue

play09:58

funcionando exactamente igual ahora bien

play10:00

podríamos llegar a un siguiente nivel

play10:03

vale podríamos llegar a un siguiente

play10:05

nivel por qué porque si miramos este

play10:07

castón hood como podemos ver se dedica a

play10:10

dos cosas por un lado se dedica a la

play10:13

gestión del estado y por otro lado al

play10:16

racing de datos así que aquí tenemos un

play10:18

ejemplo de que esto tampoco tampoco

play10:21

sería single responsibility vale esto

play10:25

nos sería exactamente al cien por cien

play10:27

responsabilidad única porque podemos ver

play10:29

que tiene dos responsabilidades gestión

play10:31

del estado gestión de datos vale

play10:33

importante ahora bien esto significa que

play10:36

deberíamos volver a refactorización

play10:39

volverá a saberlo pues depende a veces

play10:41

que sí a veces quiero por ejemplo todo

play10:43

esto que vemos aquí esto de action o

play10:45

secos en cuanto lo podríamos sacar muy

play10:47

fácil volvemos a sacarlo vale y hacemos

play10:49

aquí

play10:50

de hecho luego vamos a indagar más en

play10:52

este ejemplo podemos hacer un fet de los

play10:55

tubos y que simplemente esto haga y esto

play10:58

de aquí hacemos esto return vale y aquí

play11:01

hacemos el de delray es punto de it ya

play11:05

tenemos una función que directamente nos

play11:07

lo está sacando de aquí y ahora esto lo

play11:10

que sí que podemos hacer aquí hacemos un

play11:11

fixture y aquí ponemos el punto d en

play11:13

tendríamos aquí ya los tutús y hacemos

play11:16

el set todo

play11:18

aquí le guardamos 'todos' y en el final

play11:21

y podríamos sacar el falta de unidad

play11:24

esto lo dejamos así y ya lo tendríamos

play11:27

podríamos hacer catch del error por

play11:29

ejemplo lo podríamos hacer aquí y aquí

play11:31

tendríamos la responsabilidad también de

play11:33

hacer un caché del error y aquí hacer

play11:34

mil millones de cosas tendríamos

play11:36

diferentes historias aquí por ejemplo

play11:37

podríamos podríamos tener la lógica

play11:40

decir vale yo soy el que se encarga de

play11:42

hacer el festín de datos por lo tanto yo

play11:43

soy el que decide cómo gestionar el

play11:45

error en lugar de hacer un consell error

play11:47

por ejemplo podría decir bueno quiero

play11:49

gestionar el error de que quiero

play11:50

devolver directamente un array vacío o

play11:53

quiero devolver al menos algún tipo de

play11:55

cosa o puedes decir no voy a tener el

play11:57

error pero voy a devolver un nuevo error

play11:59

dependiendo del error que tenga por

play12:00

ejemplo si el error el código es 404 le

play12:05

voy a devolver un nuevo error porque es

play12:07

esto importante esto lo veremos más

play12:09

adelante vale pero lo que haríamos aquí

play12:11

es que en lugar de mostrar de dejar que

play12:14

pasen los errores de la infraestructura

play12:16

de del pfets lo que vamos a hacer aquí

play12:19

es comernos dentro de esto dentro de

play12:22

aquí vamos a comernos ese error y

play12:24

identificar cómo queremos devolver vale

play12:26

aquí podríamos un knock down en lugar de

play12:28

devolver el error con el status code eso

play12:32

significa que sabríamos que estamos

play12:33

haciendo un festín de datos pero y si

play12:35

estoy viendo en un local storage y si

play12:37

esto viene de las cookies y si esto

play12:38

viene del gráfico él y mil millones de

play12:40

historias vale esta sería el ejemplo por

play12:43

ahora lo vamos a simplificar pero para

play12:45

que sepas que lo interesante es que ahí

play12:46

podrías hacer la gestión de los errores

play12:48

también al hacer el festín de datos así

play12:50

que ahora ya así que podríamos quitar

play12:51

todo esto de aquí y entonces se

play12:53

simplificaría todavía más de nuevo que

play12:56

podríamos hacer pues aparte que tenemos

play12:58

los hooks aquí podríamos ver subir esto

play13:00

no podríamos decir service es esto sea

play13:03

lo mínimo y aquí podríamos hacer tu 2.3

play13:07

equis y aquí los todos pues ya

play13:09

tendríamos vamos a sacarnos todo esto y

play13:11

volvemos a hacer esto vale

play13:15

importamos el fechu tudelano fech

play13:18

'todos' fech todos quedarán aquí nuevas

play13:22

todos portando 'todos' y también el tipo

play13:25

de tuta esto lo habría que habría que

play13:27

sacarlo sacarlo a un archivo de taiz

play13:30

vale pero no puedes taquito elegida

play13:33

sacando archivos al efes tutús from

play13:36

services 'todos' bueno pues ahora falta

play13:40

que lo pongamos

play13:42

importamos el tipo del tributo y ya está

play13:46

vale entonces ya podemos ver que esté

play13:48

castón hub también ha dado una vuelta

play13:51

más hemos vuelto a hacer el single

play13:53

responsibility principle hemos vuelto a

play13:56

hacer justamente que tenga una sola

play13:57

responsabilidad por eso os digo que hay

play14:00

grados no hemos llegado y está bien que

play14:03

os quedéis a mitad vale porque de verdad

play14:05

llega un momento en el que si intentáis

play14:07

ir al límite vuestro código puede sufrir

play14:10

ya ya habéis visto no que conforme hemos

play14:12

ido indagando en el señor responsability

play14:14

la responsabilidad única hemos tenido

play14:17

que crear una estructura de ficheros y

play14:18

luego otra vez entonces está bien

play14:21

separarlo pero también tiene que tener

play14:22

en cuenta el coste que tiene esto y hay

play14:25

veces que hay principios que si los

play14:26

llevas muy lejos pueden ser

play14:27

contraproducentes solo que lo tengas en

play14:30

cuenta vale no no no que lo vuelvas ahí

play14:31

como así hay que hacerlo sí para siempre

play14:33

ya está entonces vamos a ver el ejemplo

play14:35

que tenía el artículo yo es que he

play14:37

buscado por ahí ejemplos pero el

play14:40

artículo este tiene otros ejemplos aquí

play14:42

por ejemplo habla bueno de algo parecido

play14:44

veis el mismo ejemplo el artículo tiene

play14:46

un ejemplo también de que tiene un

play14:47

efecto qué y aquí además tiene un week

play14:50

ago que entiendo que esto hace como un

play14:52

tipo de lógica el filtrado de usuarios

play14:54

aquí que a lo mejor se puede sacar en

play14:56

otro sitio entonces dice aunque este

play14:57

componente es relativamente corto se

play14:59

pueden hacer algunas cosas bueno ya aquí

play15:01

vemos que está haciendo bueno el casting

play15:03

lo ha separado también a un jucio users

play15:05

ha sacado más cosas ves está sacando

play15:07

component izando también la parte del

play15:09

united lo ha sacado aquí no sé lo que

play15:12

está haciendo es compone tizar s para

play15:14

responsabilidades mira aquí una función

play15:16

para el week hago este porque este

play15:17

componente todavía tiene aquí como una

play15:20

lógica que tiene es claro que la puedes

play15:22

extraer porque esta responsabilidad

play15:23

mejor la podrías incluso reutilizar en

play15:26

otro sitio así que lo ha extraído aquí

play15:28

en un método y ahora queda mucho mejor

play15:30

este componente mucho más fácil de

play15:32

entender y al final de mantener pues

play15:34

venga vamos con open close principle

play15:36

vamos con el open close principle el

play15:38

open close principle lo que el open

play15:41

close principal es que básicamente las

play15:42

entidades que tengamos en nuestro

play15:44

software tienen que estar abiertas para

play15:45

extender pero cerradas para ser

play15:48

modificadas claro esto en clases y tal

play15:50

pues suele tener bastante más sentido y

play15:53

en componentes del iac

play15:55

y vais a ver porque tiene un ejemplo

play15:57

bastante claro que está muy chulo y que

play15:59

vais a decir madre mía pues no he hecho

play16:01

estas cosas veces qué quiere decir esto

play16:03

que esté abierto a extensión y cerrado

play16:05

para modificación no lo voy a comentar

play16:07

porque va a ser mucho más fácil con el

play16:08

ejemplo lo vais a ver clarísimo y no os

play16:10

vais a preocupar pero una cosa que tiene

play16:12

es que tú cuando por ejemplo necesitas

play16:14

añadir o que una parte de tu software un

play16:17

componente tenga que reutilizar algo

play16:19

diferente en lugar de tener que tocar

play16:21

dentro del componente lo cual podría

play16:23

provocar que cosas que están funcionando

play16:25

dejen de funcionar lo que tienes que

play16:27

hacer es que de alguna forma desde fuera

play16:30

sea capaz de extender la funcionalidad

play16:32

que tiene ese componente o sea que en

play16:34

lugar de tener que modificar lo de

play16:36

dentro para añadirle para extender su

play16:38

funcionalidad que lo puedes hacer desde

play16:40

fuera sin necesidad de modificarlo desde

play16:42

dentro así que al final la idea sobre

play16:45

todo en riad vais a ver que esto se hace

play16:47

mucho mucho mucho con los children con

play16:49

los chiles sería un caso clarísimo de

play16:52

extensión porque tú cuando tienes un

play16:54

children lo que estás haciendo es que

play16:56

independientemente de lo que haga dentro

play16:59

el children si ya tienes claro qué es

play17:01

renderiza los estás extendiendo desde

play17:04

fuera sea lo que sea lo que estás

play17:05

pasando desde fuera puedes extender la

play17:07

funcionalidad de ese componente que

play17:09

acepta el children por ejemplo un botón

play17:10

y puede reutilizar lo que te dé la gana

play17:12

pero en cambio por ejemplo voy a hacer

play17:14

un ejemplo rápido antes de ponernos aquí

play17:15

no imagínate un botón un botón que a uno

play17:19

le llama le pasáis el children pero

play17:21

tenéis otro botón que sólo se puede

play17:23

pasar un title y el tight él sería el

play17:25

title y ya está y esto es el botón cuál

play17:28

es el problema que luego esto también

play17:29

tiene sus matices vale pero cuál es el

play17:31

problema que éste es extensible por

play17:33

defecto y éste no este no es extensible

play17:36

este para extenderlo tienes que

play17:39

modificar el componente por dentro y

play17:41

tendrías que empezar a poner le fay con

play17:43

entonces icon vale y ahora dentro tienes

play17:45

que añadir esa proviene que hacer que

play17:46

funcione en cambio este botón pues en

play17:49

algunas bases le ponías clic aquí y en

play17:51

otro sitio le dirías vale ahora

play17:52

necesitan le fay con bueno pues lo único

play17:54

que voy a hacer aquí es ponerlo en la

play17:55

afa le fay con no podría poner por

play17:58

ejemplo crear un componente que sea

play17:59

button left eye con que puedes ponerlo

play18:01

dentro y aquí poner el icono que tú

play18:03

quieras por ejemplo svg no sé que no sé

play18:06

cuánto es extensible y esto podría

play18:07

funcionar desde él desde fuera sin

play18:10

necesidad de entrar al componente button

play18:12

hemos podido extender su funcionalidad

play18:14

sin modificar el original de esta forma

play18:17

no hemos roto el contrato ese componente

play18:19

por dentro y que hagamos está utilizando

play18:21

un montón de sitios hasta aquí bien

play18:23

ahora lo vais a ver bastante claro con

play18:24

el ejemplo el patrón de los slots bueno

play18:27

me parece bien el patrón de los slots

play18:28

hay que tener en cuenta que esto se

play18:29

puede llevar a otros sitios no sólo en

play18:31

children o sea el chile es un ejemplo

play18:33

muy claro pero tenerlo en cuenta que lo

play18:36

puede llevar a muchos sitios vale

play18:37

entonces vamos a ver el ejemplo de este

play18:38

de open close principal aquí lo que

play18:40

tenemos tenemos las propias de nuestro

play18:42

componente tenemos un componente title y

play18:44

este componente title recibe un title un

play18:47

type un hr el botón text y el un clic

play18:50

bueno que lo tenemos tipado aquí lo que

play18:51

podemos ver dentro del componente

play18:52

justamente es que si el tipo es

play18:55

whistling button entonces renderiza un

play18:58

botón que se hace un clic y dentro esto

play19:01

esto no tiene sentido no nos hagáis caso

play19:03

de que esto tenga sentido y 0-6 un

play19:05

placer gracias por por la raid y por

play19:07

pasarte y genuino buenas tardes estamos

play19:10

justamente hablando de principios solid

play19:12

en riad así que nada si os gusta la

play19:14

programación quedamos que está bastante

play19:16

interesante entonces aquí tenemos un

play19:18

ejemplo y esto lo puedes ver también en

play19:20

rutas por ejemplo en una ruta que te

play19:22

diga si el path es igual a tal render

play19:23

hizo tal por qué porque eso significa

play19:26

que vas a tener que modificar por dentro

play19:27

el componente cada vez que añadas una

play19:29

nueva ruta una nueva ruta o lo que sea

play19:31

entonces esto no tenga es muy claro o

play19:33

sea no de hecho yo creo que esto esto no

play19:35

tiene mucho sentido vamos a poner un tip

play19:37

porque no tiene mucho sentido

play19:38

semánticamente vale vamos a dejarlo así

play19:41

entonces imagínate que ponéis wifi link

play19:44

button vale pues tendría sexto width

play19:45

normal button vale tendrías esto pero

play19:47

qué pasa si el día de mañana tengo el

play19:49

wef min button no digo as pues algo

play19:52

definido button el midi button vale pues

play19:55

tengo que añadirlo manualmente tengo que

play19:57

modificar esto tengo que justamente

play20:00

tengo que modificarlo si lo tengo que

play20:03

modificar significa que no estamos

play20:04

cumpliendo el principio que tiene que

play20:06

ser abierto a extensión cerrado a

play20:08

modificación vamos a ver cómo podemos

play20:10

arreglar esto para que no se modifique

play20:13

vamos a separar todo en componentes

play20:16

vamos a tener uno que sea el del title

play20:17

el del tratamiento o sentido que exista

play20:19

así que vamos a crearlo este como él

play20:22

el tight el prox ahora lo cambiaré

play20:23

porque eso lo vamos a editar vamos a

play20:25

necesitar menos cosas como hemos visto y

play20:27

la estrategia del children vamos a

play20:28

utilizarla también aquí así que vamos a

play20:30

ponerles qué es lo que tiene que

play20:31

devolver el title bueno ya veo que tiene

play20:33

este dip vale esto parece que sí que lo

play20:35

necesita el h1 también lo necesita pero

play20:38

fíjate que aquí tenemos como dos chiles

play20:41

en diferentes no así que lo que vamos a

play20:43

hacer es que esta parte que es la que se

play20:44

extiende o que queremos extender de este

play20:46

componente sin necesidad de modificarlo

play20:48

vamos a hacer que esto sea con el

play20:50

children vale ahora lo que podemos hacer

play20:53

con el title vamos a tener aquí el title

play20:55

props vamos a poner que el title sea un

play20:58

string entonces este title por ahora lo

play21:01

voy a comentar para que lo podamos

play21:02

seguir modificando ay no me he fijado si

play21:04

estaba funcionando el ejemplo a ver vale

play21:07

hasta aquí lo hemos dejado vamos a

play21:08

quitar este de single responsibility

play21:11

principal vamos a renderizar el de open

play21:15

close que se le estaban pasando ya las

play21:17

próx así que perfecto y todo esto

play21:21

ponemos aquí voy a ponerlo bien para que

play21:24

lo podamos comentar y des comentar uno a

play21:26

uno y vamos a ver si esto es renderiza

play21:28

algo principio sol y río bueno como

play21:30

podéis ver no tiene mucha historia

play21:31

también es verdad que no le he pasado

play21:33

mejor el botón text haber button text

play21:36

aloha vale es que esto es with type

play21:39

whistling button vale es que pues todo

play21:41

solo default vamos a poner width normal

play21:42

button aquí por enseñar algo no no sé si

play21:45

es que se ha quedado así si es que me

play21:47

estás donde me estás haciendo el botón

play21:48

la madre que lo parió y que está la otra

play21:50

punta ya que está fijando ahí días vale

play21:53

está que la aloja vale estaba ahí estaba

play21:55

y bueno quería ver que todo funcionaba

play21:57

para que ahora los refractory zemos vale

play21:59

y veamos que sigue funcionando entonces

play22:01

como os decía estaba creando este

play22:03

componente por aquí y aparte de este

play22:05

componente lo que vamos a hacer es

play22:07

justamente separar el title como en dos

play22:10

sitios vamos a tener por un lado el

play22:12

title ya que hemos separado pero ahora

play22:14

vamos a tener más podemos tener el title

play22:17

width link props y lo que vamos a hacer

play22:19

es que sólo tenga las próx que realmente

play22:22

necesita porque encima lo que es

play22:24

interesante de esto es que podemos ver

play22:26

qué a evitar que le pasemos alomejor

play22:30

props a un componente que no necesitaba

play22:32

así que vamos a hacer un export comes

play22:34

con el title with link esto vamos a

play22:37

decirle que tiene estas propias light el

play22:39

whistling props entonces igual title el

play22:43

chef y button milk sin necesito un

play22:46

consejo como por contrato al renunciar a

play22:48

mi trabajo tengo que avisar con 45 días

play22:51

de antelación y acabo de conseguir una

play22:54

oferta laboral en la cual me esperarán

play22:56

dos semanas que me recomiendas hacer 45

play22:59

días de antelación dio una oferta

play23:01

laboral en la cual me esperarán dos

play23:02

semanas lo mejor que puedes hacer es

play23:04

informarte con alguien que sepa eso lo

play23:05

primero que sabe que sabrá mejor que yo

play23:07

pero lo primero que puedes hacer es al

play23:09

menos dar dos dos semanas y a las dos

play23:12

semanas entonces irte a dar un preaviso

play23:15

al menos de dos semanas aunque te vayas

play23:17

a ir pero das oye vale es 45 días por

play23:19

ley o por convenio debe ser por convenio

play23:21

no por ley que son dos cosas diferentes

play23:23

entonces dudas dos semanas que es así

play23:25

que son por ley y luego te vas

play23:26

normalmente va por convenio y luego eso

play23:29

sería una y por las malas otra que

play23:31

puedes hacer es avisar a tu empresa hoy

play23:33

ha dicho dos semanas y tal podemos hacer

play23:35

algo después de las dos semanas llegar a

play23:37

algún tipo de acuerdo para hacer un

play23:38

traspaso yo intento trabajar al menos

play23:40

media jornada durante un mes para que es

play23:43

que si no es que no sé si lleva de

play23:45

buenas lo puedes intentar luego también

play23:47

puede jugar con las vacaciones

play23:48

dependiendo del número de vacaciones que

play23:50

tengas también podrías en lugar de 45 si

play23:52

te quedan 20 días de vacaciones por

play23:53

decir algo podrían ser sólo 25 días ya

play23:55

lo mejor ahí la otra empresa así que lo

play23:57

considera así que hay un montón de

play23:59

cositas que puedes echarle un vistazo

play24:00

venga vamos con esto vale lo que estamos

play24:03

haciendo aquí lo que estamos haciendo

play24:04

aquí básicamente es el hecho de vamos a

play24:07

ir separando el 'the times' del

play24:09

whistling entonces utilizamos el title

play24:11

que es el componente que hemos creado y

play24:13

en el title wikileaks lo que hacemos

play24:14

bueno en este caso no me acuerdo cómo

play24:16

era el del link es estar aquí vale pues

play24:18

hacemos esto reutilizamos sólo lo que

play24:20

necesitamos que es esta parte aquí esta

play24:22

parte de aquí para papá

play24:24

y el title title dice no puede declarar

play24:28

vale esto lo vamos a comentar lo

play24:30

comentamos aquí tenemos aquí el tight el

play24:32

estoque cierre por aquí vale y el title

play24:34

de que se queja title title children no

play24:39

es asignable atentamente teta

play24:42

bueno igualmente title es por el fce

play24:45

este que creo que no existe en el tight

play24:49

el prox track un acuerdo se arría que

play24:51

element no va

play24:54

a hacer un tour de esto vale vale el

play24:57

problema también es que si no hago un

play24:58

reto de esto esto va a realizar lo que

play25:00

yo sé vale vale creo que esto no es

play25:03

necesario

play25:05

vale pues ya estaría no tenemos el tate

play25:08

el wifi link y lo mismo podríamos hacer

play25:10

con el title with button prox que lo voy

play25:12

a sacar aquí rápidamente porque si no le

play25:15

pongo si no me puedo estar aquí todo el

play25:17

día hoy esto estaría mal y ya estaría ya

play25:20

tendríamos habríamos separado teníamos

play25:21

el title mucho más extensible a partir

play25:24

del alquiler luego tendríamos la parte

play25:26

que era con el link y utilizaríamos el

play25:28

title pero le pasaríamos por children la

play25:30

parte que tiene que cambiar y luego en

play25:32

la del botón props sería lo mismo pero

play25:34

el children sería otro diferente

play25:36

entonces esto lo que estamos haciendo es

play25:38

que el title y en este caso con el open

play25:40

close principal a nivel de componentes

play25:42

para que veáis claramente tenemos los

play25:45

buenos no sé por qué no funciona nos

play25:47

exigen acuerdo vale aquí lo tenemos

play25:49

funcionando lo que pasa vale que ahora

play25:52

ahora en lugar de tener este open close

play25:55

principal que era el que le pasábamos el

play25:57

title el type veis que pasamos un type

play25:59

en lugar de pasarle

play26:01

para indicar cuál es el que tiene que

play26:03

utilizar es que directamente ahora lo

play26:04

que podemos hacer es utilizar el title

play26:06

with y link entonces lo que haríamos

play26:08

aquí es importar el title wispa no es

play26:11

normal button perdón es el queremos

play26:13

utilizar width button aquí puesto props

play26:15

la madre que me trajo with button vale

play26:17

lo traemos aquí lo traemos aquí esto lo

play26:19

quitamos aquí está hecha red no tiene

play26:21

sentido de hecho es que además es mejor

play26:22

aquí no acaba escapó pero fíjate que

play26:25

además al no tener un componente tan

play26:27

grandes en los que sólo con las propias

play26:28

que necesita tenemos la propiedad a un

play26:30

clic que nos dice oye es que para este

play26:33

componente en concreto necesita ser un

play26:34

clic de otra forma puedes tener un

play26:36

montón de errores cuando tú haces que se

play26:39

puedan modificar de dentro y cambias

play26:40

muchos comportamientos desde dentro al

play26:42

final lo que te pasa es que dejas de

play26:44

tener singer responsability no y tienes

play26:46

un montón de pro para cambiar el

play26:47

comportamiento desde dentro en lugar de

play26:49

ser extensible sino que hay que

play26:51

modificar para cambiar su comportamiento

play26:52

y entonces aquí haríamos esto a esto por

play26:55

aquí para acá y aquí tenemos el aloha

play26:57

vale el aloha y esto aquí ahora lo bueno

play27:00

es que imagínate que el día de mañana

play27:01

tenemos este componente en 800 sitios

play27:05

imagínate es que aquí donde está la

play27:07

gracia imagínate que lo tienes en 800

play27:09

sitios y necesitas un tercero dices

play27:11

ostras es que necesitamos un title con

play27:13

otro tipo de botón vale export const

play27:15

title with yo que sé special button vale

play27:19

y tú lo creas aquí y ya tienes un

play27:21

componente totalmente nuevo que va a

play27:23

hacer que todos los demás anteriores

play27:26

sigan funcionando sin ningún tipo de

play27:27

problema para evitar pasar tantas

play27:29

propias modifica el comportamiento

play27:30

interno se puede usar con componentes

play27:32

también de hecho esto que hemos hecho

play27:33

aquí también lo podríamos hacer con

play27:35

componentes descompuestos vale esto

play27:37

también lo podríamos hacer podríamos

play27:39

hacer que en lugar de o sea podríamos

play27:42

tener el title podríamos poner title

play27:44

aquí y hacer un campo componen de forma

play27:46

así vale podríamos decir no pasa lunch y

play27:50

lideren como tal sino pasarle un title

play27:52

punto width button algo así no y hacerlo

play27:55

así y aquí pasarle a un clic que no sé

play27:57

que lo malo es que esto al final te

play28:00

puede que puede traer otros problemas

play28:02

porque por ejemplo podrías poner dos

play28:03

podrías poner cuatro podrías poner ocho

play28:05

el más difícil que es el fcc fcc es

play28:08

funcional componen eso sería el tema

play28:11

vale me dude escribiendo mis errores a

play28:12

ver estos errores los hace todo el mundo

play28:15

no os preocupéis y a veces de nuevo a

play28:18

veces te he sentido hacerlos otras veces

play28:20

hay que tener cuidado de no pasarse para

play28:21

que un nuevo si no al final se vuelve

play28:23

muy loco en el ejemplo que pueden ellos

play28:25

vale el tipo de las rutas estén muy

play28:27

claro también en lo este sería el

play28:29

ejemplo malo no utilizando vales y spam

play28:32

de unter render hizo esto si spanair

play28:33

utilizó de esto claro esto al final no

play28:36

está siguiendo el principio y lo que

play28:37

está pasando es que cada vez que tú

play28:39

añadas un nuevo pack men admin vas a

play28:42

tener que ponerlo aquí está están

play28:43

modificando el componente por dentro así

play28:45

que claro utilizando el children es que

play28:47

en la clave utilizar el children no y

play28:49

entonces en cada children vas poniendo

play28:51

aquí encima ha hecho dos cosas por un

play28:53

lado en el que ver qué le está poniendo

play28:55

para ir claro para cambiar el link

play28:57

porque se pasa una página a otra quieres

play28:58

cambiar el botón para ir a una página a

play29:01

otra perfecto ahí ya está pensaba que a

play29:05

porque aquí es como lo está haciendo

play29:06

aquí en el header vale es que es el

play29:08

componente header vale vale pues tiene

play29:10

sentido vale en el gdr estación el sitio

play29:12

está haciendo exactamente lo mismo que

play29:13

hemos hecho nosotros pero con otro

play29:14

componente que sería el header de una

play29:16

página que que sí que tiene sentido así

play29:18

este header está abierto a extensión no

play29:21

está abierto a modificación no es que

play29:23

necesite modificarlo sino que tú lo

play29:25

extiende hasta ten en cuenta que aunque

play29:27

hemos visto dos ejemplos de children

play29:28

esto a veces puede ocurrir también con

play29:30

una pro por ejemplo qué pasa que en el

play29:32

general mejor tienes clarísimo que

play29:34

siempre vas a tener un hr que va a ir a

play29:37

una página no sería no estaría tan mal

play29:40

utilizar props no pongáis a utilizar a

play29:42

la children's para todo porque no tiene

play29:44

por qué o sea esto es llevarlo un poco

play29:46

al extremo porque a lo mejor lo que

play29:47

estás haciendo aquí es dejarlo demasiado

play29:49

abierto a extensión en el sentido de que

play29:51

alguien pueda en lugar de renderizar un

play29:52

link renderizar un botón imagínate que

play29:55

él por lo que quieras quieras forzar a

play29:57

que siempre sea un link pues a veces no

play29:58

tiene tanto sentido abierto a ver lo

play30:00

tanto abrirlo tanto vale esto lo digo

play30:02

para que tengas en cuenta como siempre

play30:03

el contexto el contexto es súper

play30:05

importante ok vale vamos con liskov

play30:08

bueno disco no sé si esta gente tiene

play30:10

algún ejemplo a ver disco vale disco

play30:13

básicamente es que un objeto que sea un

play30:16

subtipo de objeto debería ser

play30:18

sustituirle por un objeto que sea del

play30:21

que hereda un súper o un súper tipo de

play30:23

ese objeto o sea que son intercambiables

play30:25

si tú haces por ejemplo un animal

play30:28

perro el son deberían ser

play30:29

intercambiables sin que pase

play30:31

absolutamente nada sin que algo

play30:32

reventase supuesto tú deberías poder

play30:34

utilizar un perro y deberías poder

play30:36

utilizar un animal porque al final si la

play30:38

clase perro está heredando de animal

play30:40

debería funcionar tú tienes el perro que

play30:43

extiende animal o el gato que extiende

play30:45

animal y entonces qué pasa aquí el perro

play30:47

puede nadar y el gato no puede nadar

play30:49

esto también se hace muchas veces con

play30:50

pájaros por ejemplo el pingüino no puede

play30:53

volar esto que es tan japonés porque el

play30:54

ejemplo que encontraba en estado en

play30:55

japonés y me ha hecho mucha gracia ha

play30:57

dicho ostras se ve súper bien la letra

play30:58

fíjate si alguien la puede leer me

play31:01

imagino que dice hola soy un gato no me

play31:02

da la gana no me gana nada en este caso

play31:05

se está rompiendo justamente este

play31:07

principio el gato como el animal debería

play31:09

ser intercambiables y lo que está

play31:10

pasando aquí es que si de repente

play31:11

utilizas es el gato pues esto te

play31:13

prestaría porque te daría un error y por

play31:16

lo tanto bueno en este caso sería así de

play31:19

new cat esto te daría un error y por lo

play31:22

tanto no estaría cumpliendo el principio

play31:23

para evitar esto podrías hacer otro tipo

play31:26

de cosas por ejemplo podrías utilizar en

play31:27

lugar de tener una superclase

play31:30

esperas tener el reino animal al final

play31:32

lo que podrías tener son tipos de

play31:34

animales por ejemplo los animales que

play31:36

pueden nadar entonces esto sería de

play31:38

swimming animal el perro que sería de su

play31:41

mismo animal pero el gato no se asume un

play31:43

animal señaló que sería de walking

play31:45

animal por decir algo y aquí este sí que

play31:47

no necesitaría ni siquiera implementar

play31:49

el swing porque es que ni siquiera lo

play31:50

necesita esto pasa por ejemplo con una

play31:52

clase de pájaros y tal pero este ejemplo

play31:54

es muy de general en riad un ejemplo que

play31:58

a mí se me ocurriría un componente por

play32:00

ejemplo pongamos un botón pongamos que

play32:02

tenemos un botón y que tenemos un text

play32:04

un title y un color vale un color y un 6

play32:08

vamos a hacer un color bien 6 y vamos a

play32:10

poner un children vamos a hacerlo así

play32:11

vale y hacemos un retour del botón y le

play32:13

ponemos esto y ponemos aquí el children

play32:16

y ponemos aquí que esto del color cada

play32:20

del color que venga y que esto es del

play32:22

tamaño que venga vale por de final claro

play32:24

esto tendría sentido porque al final le

play32:26

estábamos pasando al bueno esto no sería

play32:28

así esta parte vamos a poner así está

play32:30

color 6 vamos a poner que este 6 vamos a

play32:34

poner que si el 6 si el 6 es xl pues

play32:39

entonces vamos a poner que 18 32 píxeles

play32:42

y si no 16 píxeles vale no os fijéis

play32:45

tanto en la implementación sino más bien

play32:46

es lo que vamos a hacer después entonces

play32:48

esto hasta aquí hasta centraremos aquí

play32:51

vale y este button lo haríamos pequeño

play32:53

no fijas tanto en la implentación este

play32:55

vota de hecho lo voy a cerrar un poco

play32:56

para que lo pongamos que tenemos aquí

play32:58

por ejemplo un red button que está al

play33:00

final lo que tiene es el children y sólo

play33:02

el 6 y esto lo que hace es return

play33:05

tenemos un botón que ya tiene justamente

play33:08

tanto utilizaría el que hemos creado que

play33:11

le pasaríamos el saint saëns así el

play33:13

color siempre sería red este reto no

play33:15

hace falta pues cuál sería uno de los

play33:17

problemas que tendríamos si no

play33:19

estuviéramos siguiendo este principio

play33:21

del disco pues un problema sería

play33:23

imaginad que esté size en lugar de

play33:25

ponerle size vamos a ponerle

play33:28

entonces es bic y estoy aquí le ponemos

play33:30

xl y si no le ponemos aquí sm por decir

play33:34

algo vale entonces aquí lo que estaremos

play33:37

haciendo imaginad que tenemos aquí un

play33:38

componente imagina que tenemos un

play33:40

componente y que tenemos aquí el red

play33:43

button y tenemos aquí el children que

play33:45

sería aquí mi botón rojo bueno en lugar

play33:48

del botón rojo mi botón que funciona me

play33:50

votan que funciona tenemos el reto de

play33:52

esto con el red button y le decimos is

play33:55

big es cuál es el problema imaginad que

play33:57

el día de mañana decimos no no no es que

play33:59

este botón lo quiero cambiar lo que va

play34:01

cambiar por el componente por el que

play34:03

estamos componiendo lo vale pues hacemos

play34:05

button y dejamos el lic básicamente

play34:07

estaría como rompiendo también la

play34:08

sustitución del disco porque en lugar de

play34:11

tener o sea ya no funcionaría de repente

play34:13

aunque esté red button esté componiendo

play34:15

utilizando el button le hemos cambiado

play34:17

el comportamiento de las propias que van

play34:19

hacia abajo aquí hemos hecho aquí algo

play34:21

especial y le hemos cambiado el nombre

play34:22

lo mismo podría ser también por ejemplo

play34:25

con un usuario que en un sitio pongamos

play34:27

name y en otro first name por decir algo

play34:29

o el comportamiento que hagamos dentro

play34:31

sea diferente pero en este caso lo que

play34:33

estamos haciendo es

play34:34

red button al final no hereda como una

play34:37

clase pero sí que podríamos decir que es

play34:39

un objeto que es un subtipo de este tipo

play34:42

que es superior vale porque éste sería

play34:45

como el del que estamos generando todo

play34:46

así que lo que nos gustaría es que en

play34:49

lugar de tener el svi que esté así de

play34:51

esta forma es que el size sea compatible

play34:54

exactamente con el que tengamos arriba y

play34:56

que nos que reviente o que pase una cosa

play34:58

diferente y así podríamos dejar

play35:00

justamente esto y si ahora en el site

play35:02

digamos que ponemos que el size es x l

play35:04

el día de mañana podríamos utilizar

play35:06

tanto el subtipo como el tipo en este

play35:09

caso el botón sin que se rompa

play35:10

absolutamente nada no hay ningún cambio

play35:13

de comportamiento y tal obviamente sí

play35:15

que de la ayuda y por qué deberíamos

play35:16

añadirle qué color queremos pero normal

play35:19

porque al final el red button es normal

play35:21

que sea más específico eso es normal

play35:23

como el perro es más específico de un

play35:26

animal pero lo que no es normal es que

play35:29

de repente utilizando el subtipo se

play35:31

rompa lo que vamos a hacer con el tipo

play35:34

no se ha entendido pero ahí estaría el

play35:36

tema el tema es el subtipo lo veríamos

play35:39

poder sustituir con el tipo sin ningún

play35:42

tipo de problema ok ahí lo hemos

play35:44

entendido o sea el red button lo

play35:46

diríamos cambiar fácilmente por el

play35:48

button y no debería romperse

play35:51

absolutamente nada por ese ejemplo se me

play35:53

ocurre el tipo de objeto de tejero todas

play35:54

las varias funciones para no usar un

play35:55

switch todos deberían poder usarse con

play35:57

los mismos parámetros de poder devolver

play35:58

componentes las funciones al final los

play36:00

componentes el subtipo lo podrías poder

play36:02

cambiar por el tipo para ese principio

play36:03

ayuda mucho textil es verdad vamos con

play36:05

otro interface se gration principle

play36:08

venga vamos con el otro interface segre

play36:10

jason en este caso lo que comenta el

play36:13

artículo es que el interface de gration

play36:15

es que los clientes no deberían depender

play36:18

de interfaces que no necesitan esto lo

play36:20

hemos visto con el primer ejemplo de que

play36:22

teníamos un componente muy grande que

play36:24

necesitaba osea que recibía un montón de

play36:26

proxy al final no necesitaba no que en

play36:28

el primer ejemplo sino que en el segundo

play36:30

no lo hemos visto con el open open close

play36:32

principle el title al principio recibía

play36:34

demasiadas cosas ahora demasiado

play36:36

parámetros su interfaz está de las

play36:38

propias fíjate recibirá todo esto cuando

play36:40

dependiendo del type había veces que no

play36:42

lo necesitaba o sea si el type era

play36:44

default no necesitaba ninguna de estos

play36:46

si el type era wifi link button sólo

play36:48

necesitaba el hr entonces estaba

play36:50

recibiendo más información de la que

play36:52

necesitaba y esto a veces no solo pasa

play36:54

cuando hacemos estos componentes que son

play36:58

demasiado grandes aunque

play37:00

eso que tiene más de una responsabilidad

play37:02

esto también puede pasar cuando vamos

play37:04

cuando lo que hacemos es que viajen

play37:06

objetos por ejemplo mira este ejemplo va

play37:09

a ser muy muy claro tenemos aquí un

play37:11

vídeo listo o sea tenemos un tipo vídeo

play37:13

tenemos las propias que es una red de

play37:15

vídeos vale y entonces en hayter se le

play37:18

pasa a todo pues fíjate que en el

play37:19

componente zoom neil lo que estamos

play37:21

haciendo es pasarle todo el vídeo

play37:23

estamos pasando el vídeo completo pero

play37:25

realmente es un mail el componente zoom

play37:27

neil necesita el vídeo completo vamos a

play37:29

verlo si lo miramos aquí podemos ver que

play37:32

aunque se está pasando el vídeo contra

play37:34

las próx sólo necesita el cover journal

play37:36

esto justamente es lo que indica el

play37:39

principio de que el cliente los clientes

play37:41

en este caso el componente túnel es un

play37:44

cliente no necesita

play37:47

necesita dos aprox sólo deberían recibir

play37:50

lo que necesitan porque es en una

play37:52

interfaz que estamos pasando lo que

play37:54

tiene que como respetar es demasiado

play37:56

grande porque si este componente es un

play37:58

mail que siempre recibe un vídeo y tiene

play38:00

que acceder a cover y ahora él siempre

play38:02

fuese así si tú este componente lo

play38:04

quisieras cambiar por otro para

play38:05

sustituirlo no tienes esto lo que es

play38:07

cambiar por otro tendrías que asegurarte

play38:09

que le sigues pasando exactamente el

play38:11

mismo objeto de vídeo porque no sabes si

play38:15

al final aquí haces otra cosa como por

play38:17

ejemplo en el alt que no no me meto en

play38:20

sí es buena práctica mala práctica el

play38:22

hecho de cómo está hecho el componente

play38:24

si no hablamos del principio que hay que

play38:26

que hay por encima aquí a mejor title

play38:28

vale y en lugar de pixel pues aquí

play38:31

ponemos un píxel match entonces es más

play38:34

difícil que tú puedas seguir manteniendo

play38:37

la funcionalidad porque le está pasando

play38:40

demasiadas cosas vale si la interfaz es

play38:42

demasiado grande el contrato que tiene

play38:43

el componente demasiado grande cuando lo

play38:45

quieras cambiar tienes que asegurarte

play38:47

que le sigue pasando todo el contacto de

play38:48

la interfaz porque no podría romper

play38:50

cosas así que este ejemplo está bastante

play38:52

bien

play38:53

ah mira y encima lo que está haciendo es

play38:55

seguir separando seguir separando claro

play38:58

y aquí pues puedes ver vale si es un

play38:59

sitio un cover y orel el vídeo vale pero

play39:03

yo entiendo que ahí le pasará ves le va

play39:04

a pasar solo el cover your él porque es

play39:06

lo único que necesita el fonden así que

play39:08

en este caso tiene más sentido que

play39:10

sobrepase la prop que necesita mucho más

play39:12

fácil de testear a la hora de testear si

play39:14

tuvieras que simular el uso de este

play39:17

componente muy mucho más fácil de paso

play39:19

es un string a que le tenga que pasar un

play39:21

objeto completo con todas las

play39:22

propiedades que puede tener vídeo que

play39:24

pueden ser este ejemplo puede parecer

play39:25

muy poco pero puede ser muchísimo aquí

play39:27

además como podemos ver es súper fácil

play39:30

que puedas extender la funcionalidad o

play39:32

incluso pasarle diferentes dependiendo

play39:34

de knight en tiene el cover your él o

play39:36

tiene el premio journal vale pues sólo

play39:38

le vamos a pasar la propia necesita

play39:40

dependiendo de qué valores el que está

play39:41

así que minimizamos un poco las

play39:43

dependencias entre componentes y

play39:45

simplificamos el contrato que tienen los

play39:47

componentes en el ejemplo que yo he

play39:49

puesto que es el de este interface se ve

play39:52

que yo no sé qué bueno lo podemos ver

play39:54

muy claro igual no sé si lo dejo como

play39:56

como deberes pero lo que podemos ver es

play39:59

que en este post este objeto post está

play40:01

pasando hacia abajo otro ratón o post

play40:03

title post post state post y esto no

play40:06

tiene mucho sentido porque no hace falta

play40:08

que lo tengan todo por ejemplo el post

play40:10

title pues el post title sólo a la falta

play40:13

que tenga el twitter así que el title

play40:15

que puede ser esto lo podemos extraer de

play40:17

texto y también pero para simplificar lo

play40:19

vamos a poner así no y bueno claro es

play40:22

que esto no hace falta hacerlo aquí

play40:23

podemos hacer que esto sea title y esto

play40:26

sea no estaríamos simplificando bastante

play40:28

y el day props pues esto lo mismo es que

play40:30

de hecho aquí le estamos pasando en

play40:33

lugar de todo el post pues le podríamos

play40:34

pasar credit edad o incluso le podrían

play40:36

pasar el string directamente pero bueno

play40:38

vamos a indicar que esto imaginemos que

play40:40

es así vale crédit de edad que esto

play40:42

debería ser una fecha entonces el crit

play40:45

edad vamos a poner que esto es un dato y

play40:47

esto tan fácil como esto y entonces en

play40:49

lugar de hacer que viaje el objeto

play40:50

constantemente lo que vamos a hacer es

play40:52

que el post title pues sólo recibe el

play40:54

taita póster y que en este caso en lugar

play40:58

de todo el post va a recibir el póster

play41:02

a

play41:03

esto muchas veces a mucha gente lo que

play41:06

le pasa es que se vuelve loca con esto

play41:08

dice ah vamos a pasar esto hasta acá

play41:10

vamos vamos todo todo pasando todo cuál

play41:13

es el problema a veces de esto que no

play41:15

tiene por qué ser una mala práctica en

play41:17

general o sea puede estar bien a veces

play41:20

de hecho de nuevo el contexto es muy

play41:22

importante estos son principios que a

play41:24

veces tienen sentido a veces tienen

play41:26

menos sentido y que a veces tienen más

play41:28

sentido vale entonces hay veces que esto

play41:31

mucha gente lo hace esto puede estar

play41:34

bien pero también estar mal porque puede

play41:37

estar bien porque a lo mejor tú sigues

play41:38

haciendo esto dices vale post-it el

play41:40

title no sé qué pero por otro lado puede

play41:42

estar mal porque porque estás pasando

play41:44

información que no es necesaria no

play41:46

aunque es verdad que aquí la interfaz te

play41:48

dice oye solo tienes el string vale pues

play41:51

hasta ahí bien no hay hasta ahí bien o

play41:53

sea al menos en la interfaz de este

play41:55

componente te dice que sólo recibe el

play41:57

twitter pero igualmente estás haciendo

play41:58

aquí una copia de un objeto que puede

play42:00

ser enorme que muchas veces puede ser un

play42:02

innecesario vale puede ser innecesario

play42:05

porque imagínate que el post tiene a

play42:07

reyes creo que se un montón de

play42:10

propiedades si estás haciendo una copia

play42:11

estás creando un nuevo objeto en cada

play42:13

render además cada vez que se realiza

play42:14

este post si lo tienes controlado si lo

play42:16

entiendes no pasa nada pero tengo en

play42:18

cuenta imagínate que te hubieses aquí un

play42:20

estado count

play42:22

o likes suponemos que tienes likes &

play42:25

likes y van cambiando los likes pues

play42:27

cada vez que cambien los likes lo que va

play42:28

a pasar imagen que estos lo pasamos al

play42:30

spam y tenemos aquí los likes cada vez

play42:33

que se realicen los nuevos likes lo que

play42:34

va a pasar es que vas a tener una nueva

play42:36

copia aunque aunque esté pero la copia

play42:38

de salud pero bueno que no sea de salud

play42:40

creas un nuevo objeto aunque no sea

play42:41

profunda la copia creas un objeto creas

play42:43

un nuevo objeto y al final además te

play42:46

puede dar la falsa sensación de que lo

play42:47

que estás pasando son son cosas

play42:50

inmutables por ejemplo si tú haces esto

play42:53

y pongamos que aquí en el post day

play42:55

tienes un list of tax por decir algo que

play42:58

esto es una red obviamente sobre el

play43:00

listado está que esto es una red de n

play43:02

buena pone bien y porque tampoco sé de

play43:04

qué es

play43:05

puedes tener la falsa sensación que post

play43:07

day te está recibiendo una lista de tags

play43:09

que es una copia y que tal no sé quién

play43:12

es o cuánto y te puedan falsa sensación

play43:14

porque al final lo que estás haciendo

play43:15

justamente aquí lo que dices tú una

play43:16

copia que es que nos profunda sino que

play43:19

es superficial que no digo que esté bien

play43:21

que esté mal que no sé qué es odio que

play43:23

lo tengáis todo esto en cuenta por qué

play43:26

no está bien que al menos aquí estaba el

play43:28

interfaz pero aquí pasan cosas que

play43:30

tienen un coste que tiene unas

play43:31

implicaciones que hay que controlar y

play43:33

hay veces que si lo hace de una forma

play43:36

incontrolada te puede morder vale de

play43:39

hecho he visto un montón de programas

play43:41

justamente con estas cosas por llevarlas

play43:43

al yo en este caso por ejemplo en este

play43:46

ejemplo yo en este ejemplo utilizaría

play43:48

exactamente esto porque porque él parece

play43:51

bastante sencillo creo que se entiende

play43:52

creo que tiene sentido extraer las dos

play43:54

propios que son y ya está

play43:56

ahora que el post-it él tiene que

play43:58

recibir 10 props del post pues

play44:00

igualmente haría lo otro vale así que

play44:02

todo tiene su caso de uso y su idea vale

play44:06

para que lo tengáis en cuenta es no

play44:08

enviar todo un objeto en resumen esto en

play44:10

resumen es evitar enviar props objetos

play44:13

información que los componentes no

play44:16

necesiten vale por ejemplo el post dates

play44:18

sobre sólo necesitaba el crédito o el

play44:21

crédito crédito pues sólo le vamos a

play44:24

pasar esa información no le vamos a

play44:25

pasar todo el post porque porque no

play44:27

necesita tener informa esa información

play44:28

aquí con los dibujitos vale los clientes

play44:31

no deben ser forzados a depender

play44:33

que no van a utilizar bueno de métodos

play44:35

que no van a utilizar en este caso ya

play44:37

veis que no es tanto ese ese estilo aquí

play44:41

tenemos ejercicios todos los robots

play44:43

tienen que hacer spin aragón rotar no sé

play44:46

qué y aquí vemos que cada robot va a

play44:48

hacer una cosa en concreto los robots

play44:50

que tiene en brazos rotan los brazos los

play44:52

que tienen antenas hacen chicle con las

play44:54

antenas y cada robot solo hace una cosa

play44:56

solo recibe la información que realmente

play44:58

necesita en este caso es mucho más

play45:00

sencillo hacer esto que el context

play45:02

porque porque el contexto se puede se

play45:05

puede reventar mucho de los principios

play45:07

que hemos estado hablando y a la hora de

play45:08

testear esta parte es mucho más fácil

play45:10

hacerlo con pasándole una fecha o sea

play45:14

que fíjate esto es tan fácil como probar

play45:16

o sea probar esto está tirado haces así

play45:18

haces así haces un new day y ya está ya

play45:20

tienes este componente ya está probando

play45:23

en cambio si tienes un context pero ya

play45:25

tienes que crear aquí un context tendría

play45:27

que pasar cuál es el valor del contexto

play45:29

no tendrías que empezar a grape ar

play45:32

el context puede estar bien pero hay que

play45:34

utilizarlo con cuidado especialmente ya

play45:36

os digo que tiene casos hay no digo que

play45:37

esté siempre en contra pero en esto en

play45:39

este ejemplo yo no utilizaría un context

play45:41

porque al final lo complica bastante y

play45:43

estamos viendo que está tirando se hace

play45:46

una responsabilidad de leer de un

play45:48

contexto sería más inyección de

play45:49

dependencias porque el contexto lo

play45:51

podemos utilizar para eso para que te dé

play45:52

cuidado un poco con esto sobre complicar

play45:54

a veces es venga vamos con la última va

play45:56

que sólo nos queda uno que la inversión

play45:58

y la independencia inversión principal

play46:00

como su nombre indica es que deberíamos

play46:03

nuestros componentes nuestras clases

play46:05

funciones deberían depender de

play46:08

abstracciones y no de implementaciones

play46:11

concretas por ejemplo antes justamente

play46:14

hemos podido ver un ejemplo con el

play46:15

action era una implementación concreta

play46:17

ya os digo que depende como lo queráis

play46:19

llevar al final también ria estaríamos

play46:21

en lugar de depender de una abstracción

play46:22

está estamos dependiendo de una

play46:24

implementación concreta vale aquí veo ya

play46:26

un ejemplo que es bastante curioso y

play46:28

bastante típico donde mucha gente a

play46:30

veces suele tener estos problemillas

play46:32

aunque tiene alguna cosa que no está mal

play46:34

no porque aquí podemos ver que éste

play46:36

fischer lo que es interesante es que

play46:37

aquí podemos ver que estamos como

play46:39

dependiendo de liu swr aquí tendríamos

play46:42

esta url y estamos dependiendo este

play46:44

fichero

play46:45

sabemos como su implementación de la url

play46:47

italia tenemos una implementación de que

play46:49

editamos un fichero con una url y esto

play46:51

lo tenemos aquí o sea esto no tenemos

play46:53

una cosa que nos esté atrayendo de esta

play46:55

necesidad para arreglar esto lo que

play46:57

podríamos hacer es crear una abstracción

play46:59

que no dependiese absolutamente nada de

play47:01

saber la url ni de que necesitamos este

play47:04

fichero como a ver que estamos el fechas

play47:05

y que lo vamos a saber no pasaría

play47:07

absolutamente nada pero lo que podríamos

play47:09

es separar tanto el juz fets para quitar

play47:11

el fecha este de aquí en medio o sea lo

play47:13

que vamos a hacer por ejemplo sería

play47:15

sacar todo esto en un casto en jugo y

play47:17

depender pero vamos a crear el caso juli

play47:19

vamos a llamar los fecha al punto t s x

play47:22

1 s x no hace falta después empezamos

play47:25

mal empezamos que unirse sw vamos a

play47:27

crear es así quita de la interfaz porque

play47:29

abajo alguno se vuelve aquí un poco

play47:31

tarumba temos la equis del string y aquí

play47:33

vamos a utilizar el fechar vale fecha y

play47:36

que el fecha nos devuelva una promesa

play47:38

del tipo t estamos creando como la

play47:40

interfaz que sea como la ex abstracción

play47:42

y lo mismo vamos a hacer con la

play47:43

respuesta de esta forma lo que vamos a

play47:45

conseguir es que él si el día de mañana

play47:47

en lugar de poner aquí que necesitamos

play47:49

el pfets que necesitamos esta url en

play47:50

lugar de depender de esa de dónde vamos

play47:53

a extraer la información lo que vamos a

play47:54

hacer es separarlos para poder cambiarlo

play47:56

e inyectarle un sitio totalmente

play47:58

distinto o sea decir vale lo vamos a

play48:00

sacar de un sitio diferente lo podemos

play48:02

sacar de una url puedo sacar de otro en

play48:04

point del local storage de la caché de

play48:06

donde tú quieras entonces aquí lo que

play48:08

podemos tener claro es que lo que

play48:10

necesitamos es que cumpla tanto la

play48:12

interfaz de liu sets como la de la

play48:14

respuesta es lo que queremos que cumplan

play48:16

así que le vamos a poner aquí la

play48:17

respuesta y que queremos que esto tenga

play48:18

la data sino que sean de find el error

play48:21

string y todo lo que lo que queramos que

play48:24

queramos utilizar a la hora de recuperar

play48:26

esta información es importante que

play48:28

cumpla esta abstracción que estamos

play48:30

haciendo ya esto porque se queja de

play48:31

ahora hacemos este set que llamamos you

play48:34

sets porque es de hacer un set de datos

play48:37

como le puedo llamar sus data vamos a

play48:39

llamarle -usted vale en lugar de jazz

play48:41

fest porque effects parece que es muy de

play48:42

la implementación y como hemos dicho

play48:43

justamente queremos evitar la

play48:45

implementación le vamos a poner le vamos

play48:47

a pasar tanto una aquí como el fletcher

play48:49

y esto que estamos haciendo también lo

play48:50

que estamos evitando es que nuestro

play48:52

componente sepa que estamos utilizando

play48:54

sw swr

play48:57

y si le pasa a un latte por aquí y esto

play48:59

devuelve la respuesta del tipo te vale

play49:03

supuesto esto bien creo que si response

play49:06

y ahora te muestro tener la beta bueno

play49:09

esto sí que no lo podemos copiar de aquí

play49:10

más o menos que tenemos teníamos aquí la

play49:13

dieta el error si está validando

play49:15

tendríamos aquí en lugar del es wr este

play49:18

aquí lo que te pasaríamos por un lado

play49:20

sería lo que queremos recuperar y aquí

play49:23

tendríamos la aquí vale el aquí el

play49:25

fetzer y devolveríamos tanto la de eta

play49:28

como el error como se está validando

play49:29

vale hemos creado una abstracción lo que

play49:31

estamos haciendo es utilizar el swr pero

play49:33

abstraído porque porque ahora en nuestro

play49:36

ejemplo de bueno si lo he hecho todo

play49:38

bien porque es un montón de cosas pero

play49:39

en nuestro ejemplo bueno lo que haríamos

play49:41

es que podríamos utilizar este fecha y

play49:44

si lo podríamos inyectar directamente si

play49:46

no estaríamos pasando en lugar de tener

play49:48

la implementación aquí lo que estaríamos

play49:50

es inyectar lo o sea que todo esto lo

play49:52

podríamos utilizar sin necesidad de

play49:54

saber cómo vamos a hacer el fich de

play49:56

datos lo podríamos hacer de un montón de

play49:58

formas y ahora lo veremos el fecha de

play49:59

este lo vamos a utilizar todavía pero

play50:01

vamos a poner aquí el tac del response

play50:03

que lo vamos a necesitar vamos a pasar

play50:05

con el de él y de que sea un number y el

play50:08

title title un estricto response type y

play50:12

esto le vamos a decir en lugar de

play50:14

utilizar el swr este vamos a utilizar

play50:16

nuestros yusef yusfi que no me porque no

play50:20

me lo lo exportado si a la cita pero

play50:23

newsday está vale lo importamos ahora

play50:27

quitamos la importación estadios wr y

play50:29

ahora que tenemos esto le pulsamos el

play50:31

responsable son array con él aquí

play50:34

'todos' y directamente el fecha si

play50:36

decimos que esto va a devolver primor

play50:38

response type vale

play50:42

alguna porque ya necesitamos ya

play50:45

necesitamos esto y ahora os explicaré

play50:47

por qué necesitamos la url porque ya no

play50:48

le pasamos la url ahora os lo aplicó

play50:50

porque esto vamos a llamarle lugar de

play50:53

facer vamos a llamarle

play50:55

setzer from a pie por ejemplo y esto en

play50:59

realidad ya sabe que a pie es la que

play51:00

quiere utilizar no la hemos visto antes

play51:02

es esta de buena manera ópera te admira

play51:04

perfecto dirige al compañero más

play51:06

algo es esta url ya esto ya lo tenemos y

play51:08

aquí tenemos el fecha de forma que hemos

play51:11

hecho con todo esto es que todavía

play51:13

algunos gustaba just the law and igual

play51:17

se ha escapado alguna cosa a la hora del

play51:18

a qué le llaman fecha que es que tiene

play51:21

que llamarse fecha perdón perdón que se

play51:23

te que llamar fecha quería poner aquí el

play51:25

tema éste de que ahora sí vale que hemos

play51:28

hecho aquí tenemos como esta abstracción

play51:30

que le hemos llamado yusif es que al

play51:32

final tenía que haber sido just data

play51:33

porque no queremos que se llame fecha

play51:35

pero bueno hemos creado esta interfaz

play51:37

vale que es una abstracción donde vamos

play51:38

a pasar tanto la key que es un string y

play51:40

lo que le vamos a inyectar como

play51:41

dependencia y esto es lo que es súper

play51:43

importante y en lo que te vuelve loco

play51:44

porque lo que hemos hecho aquí gracias a

play51:47

toda esta extracción es que le podemos

play51:48

inyectar como vamos a hacer el phising

play51:50

de datos sin saber de dónde lo va a

play51:52

sacar lo importante de todo esto es que

play51:55

realmente tiene que cumplir todo este

play51:57

contrato tiene que cumplir que le

play51:58

tenemos que pasar un aquí de un string y

play52:00

le tengo que pasar un fichero que va a

play52:01

devolver una promesa vale no le

play52:03

devolvemos ningún parámetro y te que

play52:05

devolver una promesa donde nos devuelva

play52:07

el tipo genérico de que es el que le

play52:09

estamos indicando aquí a esta te si está

play52:11

te está te sería justamente el

play52:13

responsbale una rey del response type

play52:15

que hemos dicho que sería una red de

play52:16

ideas y titles ya hemos creado esta

play52:18

abstracción y estamos utilizando todo

play52:20

esto sin necesidad de saber si lo vamos

play52:22

a sacar de una api de gráfico el de

play52:23

de belloch ese de locales tórax y

play52:25

vas a ver cómo de potente es porque una

play52:27

vez que tienes esto que esto lo

play52:28

podríamos separar en lugar de ponerlo

play52:30

aquí este fecha de aquí en medio lo

play52:32

podríamos separar a otro archivo y todo

play52:34

esto este fichero lo tenemos así como

play52:36

que al final podríamos crear otro fecha

play52:38

que haga exactamente cumpla la interfaz

play52:41

no promise response esto va a cumplir la

play52:45

interfaz pero lo que va a pasar es que

play52:48

en realidad lo va a sacar por ejemplo de

play52:50

un objeto o sea esto es un objeto y

play52:52

podemos ver que no sé qué es

play52:54

absolutamente de nada porque está

play52:55

cumpliendo exactamente la misma interfaz

play52:56

y esto podría también exactamente

play52:59

funcionar si en lugar de hacer esto

play53:01

pusiéramos que esto lo saca del local

play53:03

esto right punto guetta ítem y tenemos

play53:06

aquí los posts y esto hacemos entonces

play53:09

bueno esto sería un poco más complicado

play53:10

porque aquí tendríamos el ítem y

play53:13

tendríamos que hacer un reto si tenemos

play53:15

el aire jason pase a items bueno vamos a

play53:18

ponerle posts post entonces a tengamos

play53:20

o sí si no pues hacemos un arriba pero

play53:23

fíjate que estos tres lo que estamos

play53:25

haciendo es justamente inyectar esta

play53:27

dependencia de forma que

play53:29

independientemente de donde extraemos

play53:32

los datos independientemente o sea no

play53:34

nos estamos no sea yo no sé nada de aquí

play53:37

nada de lo que hay aquí o sea si yo

play53:39

desapareciese esto que no funcionaría

play53:41

obviamente pero lo que estamos haciendo

play53:43

es que esto sólo podríamos inyectar por

play53:45

aquí le podríamos pasar por propia o por

play53:47

contexto podríamos utilizar un contexto

play53:48

esta mente y fíjate lo potente que es

play53:50

esto fíjate lo potente que sector lo

play53:52

potente que es esto es que podrías

play53:53

utilizar

play53:54

imagínate que tenemos un contexto y

play53:56

tenemos aquí fetzer o dudus from y para

play54:01

esto le llamamos flecha news contexto

play54:03

podríamos hacer así decidir nosotros si

play54:06

lo queremos recuperar de la api from

play54:07

local storage de donde sea vale el

play54:11

llamado bus con text y esto deberá

play54:12

pasarle el contexto bueno ya me

play54:14

entendéis vale hoy es global context

play54:16

para que lo entendáis mejor o

play54:17

directamente que sea totalmente

play54:19

transparente que estuviese al fecha y

play54:22

que sólo desde el punto del global

play54:24

context desde un solo sitio estemos

play54:26

cambiando

play54:27

dónde vamos a sacar esta información y

play54:29

nosotros en estos componentes no estamos

play54:31

viendo en ningún sitio en ningún sitio

play54:34

estamos viendo realmente de dónde sale

play54:37

esta información porque en ningún lado

play54:39

se ve que estamos haciendo un fet si

play54:41

estamos atacando una app y si vamos al

play54:43

local storage si sale de las cookies y

play54:45

le estoy haciendo un mod no lo sabe no

play54:47

lo sabe vale esto es lo que hace que

play54:49

esto sea la inyección de dependencias

play54:51

hace que sea realmente potente en este

play54:53

caso el caso más claro se ve justamente

play54:55

aquí estos tres fechas se no estamos en

play54:57

jets se los podemos inyectar e indep y

play54:59

los tres funcionan porque cumplen el

play55:01

contrato no cumplen la abstracción y no

play55:04

nos basamos en la implementación a la

play55:07

hora de utilizar todo esto ok así que

play55:09

esto es lo que realmente potente lo

play55:10

importante y lo interesante de la

play55:12

inyección de dependencia si esto lo

play55:14

podéis hacer en un montón de historias

play55:15

si el facher es un mod para qué sirve el

play55:17

aquí y aquí está a ver por ejemplo este

play55:20

fecha este es un modo está aquí en

play55:22

realidad es un tema más de

play55:24

swr vale está aquí lo utiliza para el

play55:28

global state para la caché y este tipo

play55:30

de cosas o sea al final si tú este todo

play55:33

y lo haces desde otro sitio va a

play55:35

utilizar la caché interna para no volver

play55:37

a llamarlo o si lo actualizas para

play55:39

sincronizarlo este tipo de cosas pero os

play55:41

quedáis con esto con la potencia que

play55:43

tiene esto o sea yo creo que aquí es

play55:45

donde se ve justamente lo lo interesante

play55:48

no el hecho de cómo tienes aquí ahora

play55:50

tres fechas que esto es totalmente claro

play55:52

acá no tengo

Rate This

5.0 / 5 (0 votes)

هل تحتاج إلى تلخيص باللغة الإنجليزية؟