class: center, middle ``` _____ ____ _ _____ _____ / ____| / __ \ | | |_ _| | __ \ | (___ | | | | | | | | | | | | \___ \ | | | | | | | | | | | | ____) | | |__| | | |____ _| |_ | |__| | |_____/ \____/ |______| |_____| |_____/ ``` ??? vou apresentar meu ponto de vista sobre SOLID Eu posso estar errado --- # Agenda 1. O que é SOLID 2. Problemas de não termos SOLID 2. Vantagens 3. Desvantagens 5. Uma estruturação diferente para o SOLID 9. Interface segregation 10. Dependency Inversion 8. Liskov Subsctitution Principle 7. Open Close 6. Single Responsability ??? Reordenar --- # O que é SOLID ? ## S - Single Responsability ## O - Open Close ## L - Liskov Subsctitution Principle ## I - Interface Segregation ## D - Dependency Inversion ??? Definição básica de cada item --- # Desvantagens --- # Verbosidade ```TypeScript const result: any[] = await axios.get('/users').response.data.data.users; ``` ### VS ```TypeScript interface IUser {...} interface IHttpClient {...} class EmptyWhen404HttpClient implements IHttpClient {...} // ==================== const client: IHttpClient = new EmptyWhen404HttpClient(); const result: IUser[] = await client.get('/users'); ``` ??? --- # Complexidade ? > "É melhor ficar travado no test do que travar o time todo" - James ??? É realmente complexo ? Isso é argumento de alguns. --- # Perfeccionismo ( Preciosismo ) ![Losting time](https://raw.githubusercontent.com/edgardleal/SOLID/master/docs/img/perfecionismo.jpg) ??? É preciso saber quando esta sendo exagerado --- ### Boilerplate ### Orientação a Objetos ??? Ressaltar a complexidade expalhada --- # Vantagens ### Facilidade de uso com Arquitetura Limpa ### Reutilização de código ### Testabilidade ### Manutenibilidade ### Facilidade de compreenção do código ??? Link para a apresentação de James no final --- # Problemas que podem ser resolvidos ```js axios.get('/users'); ``` ## Problemas com esta implementação * Falta tratamento de erro * Se receber 404 retorna null? * Se receber 502/503/504 tenta novamente? --- # V2 - Implementando a Resiliência ``` axios.get('/users') .then(response => response.data) .then(res.json.bind(res)) .catch((error: AxiosError) => { const retry = () => { return instance.get('/').then(response => response.data); }; console.error(error.message); retry().then(res.json.bind(res)).catch(e => { retry().then(res.json.bind(res)).catch(error => { res.status((error.response || { status: 500 }).status); console.error(error.message); res.end(error.message); }); }); }); ``` --- ### Isso é comum ? ``` ag 'axios.get\(' | wc -l ``` #### Resultado * 62 dentro de casinha * 215 dentro dos projetos da sanar ( em minha máquina ) ??? Vantagens e Desvantagens da simplicidade --- # Na prática ## É normal começar com rabisco .image[![Scriblle](https://raw.githubusercontent.com/edgardleal/SOLID/master/docs/img/michelangelo8-scriblle.jpg)] ??? Um erro é achar que o código começa perfeito --- # Nova estrutura ``` _____ _____ __ ___ _____ |_ _| | __ \ / __ \ | | / ____| | | | | | | | | | | | | | (___ | | | | | | | | | | | | \___ \ _| |_ | |__| | | |__| | | |____ ____) | |_____| |_____/ \____/ |______| |_____/ ``` --- ![American Idols](https://raw.githubusercontent.com/edgardleal/SOLID/master/docs/img/idols.jpg)] --- # Odem Ideal ``` _____ _____ _ __ _____ | __ \ |_ _| | | / __ \ / ____| | | | | | | | | | | | | | (___ | | | | | | | | | | | | \___ \ | |__| | _| |_ | |____ | |__| | ____) | |_____/ |_____| |______| \____/ |_____/ ``` ??? Dependency Inversion Interface Segregation Liskov Open Close Single Responsability --- ## Separando as coisas ### SOL 🌞 ( ID ) .left[![Lights](https://raw.githubusercontent.com/edgardleal/SOLID/master/docs/img/lights.jpeg)] ??? São regras para validar o que esta sendo feito Precisam do LID para funcionar bem --- # LID ## Liskov ## Interface Segregation ## Dependency Inversion .left[![Lights](https://raw.githubusercontent.com/edgardleal/SOLID/master/docs/img/men-working.jpg)] ??? Liskov nesta lista é principalmente importante para mim --- # D - Dependency Inversion .center[![Sticky Code](https://edgardleal.github.io/SOLID/img/sticky.jpg)] --- # I - Interface Segregation .center[![Interface World](https://edgardleal.github.io/SOLID/img/gorilla_holding_banana.jpg)] ??? Verbosidade pode ser boa De nomes grandes mesmo --- # L - Princípio da Substituição de Liskov ![LID](https://raw.githubusercontent.com/edgardleal/SOLID/master/docs/img/Liskov_DI_IS.jpg) --- # O - Open Close ```bash # 22 package-lock.json # 22 src/modules/courses/schemas/courses.schema.ts 26 src/modules/levels/levels.controller.test.ts 26 src/modules/utils/factory.ts 30 src/modules/courses/courses.controller.test.ts # 32 package.json 32 src/modules/courses/courses.controller.ts 34 src/app.ts 38 src/datasources/rabbitmq.datasource.ts 66 src/modules/events/user-event.service.ts 557 ``` --- # S => Responsabilidade Única ## Conciso > "reduzido ao essencial; em poucas palavras (diz-se de escritos, ideias, discurso etc.); preciso, sucinto, resumido." --- # Responsabilidade de Negocio vs Responsabilidade de Codigo ![Árvore de Chamadas](https://edgardleal.github.io/SOLID/img/function_call_tree.png) --- # Multi Responsabilidades ```typescript import mysql from "mysql"; export interface IUserData { name: string; address: string; email: string; } export async function registerNewClient(data: IUserData): Promise
{ const con = mysql.createConnection({ host: "localhost", user: "root", password: "123456", database: "test" }); return new Promise
((resolve, reject) => { con.connect(function(err) { if (err) return reject(err); console.log("Connected!"); const { name, address, email } = data; const sql = `INSERT INTO customers (name, address, email) VALUES ('${name}', '${address}', '${email}')`; * con.query(sql, function(err) { if (err) return reject(err); console.log("1 record inserted"); resolve(data); }); }); }); } ``` --- # Referencias ### Arquitetura limpa * https://pt.slideshare.net/jamersonweb/arquitetura-limpa-131970246 ### Slides * https://github.com/edgardleal/SOLID