|
| 1 | +/* |
| 2 | +╔═══════════════════════════════════════╗ |
| 3 | +║ Autor: Kenys Alvarado ║ |
| 4 | +║ GitHub: https://github.com/Kenysdev ║ |
| 5 | +║ 2024 - Rust ║ |
| 6 | +╚═══════════════════════════════════════╝ |
| 7 | +----------------------------------------------------- |
| 8 | +* SOLID: PRINCIPIO DE SEGREGACIÓN DE INTERFACES (ISP) |
| 9 | +----------------------------------------------------- |
| 10 | +- Una estructura no debería estar obligada a implementar interfaces que no utiliza. |
| 11 | +' Evitando crear grandes clases monolíticas. |
| 12 | +
|
| 13 | +_______________ |
| 14 | +' NOTA: Este ejemplo muestra el uso CORRECTO. Para suponer un ejemplo que viole el principio, sería. |
| 15 | +' Imaginar todos los métodos siguientes, en una sola interfaz, entonces algunos dispositivos |
| 16 | +' implementarían una interfaz que no necesitan. |
| 17 | +*/ |
| 18 | + |
| 19 | +//____________________________________ |
| 20 | +// Interfaces |
| 21 | +trait Playable { |
| 22 | + fn play(&self); |
| 23 | +} |
| 24 | + |
| 25 | +trait Displayable { |
| 26 | + fn display(&self); |
| 27 | +} |
| 28 | + |
| 29 | +//____________________________________ |
| 30 | +// Implementación |
| 31 | + |
| 32 | +struct Speaker; |
| 33 | + |
| 34 | +impl Playable for Speaker { |
| 35 | + fn play(&self) { |
| 36 | + println!("El altavoz está reproduciendo música."); |
| 37 | + } |
| 38 | +} |
| 39 | + |
| 40 | +//____________________________________ |
| 41 | +struct Phone; |
| 42 | + |
| 43 | +impl Playable for Phone { |
| 44 | + fn play(&self) { |
| 45 | + println!("El teléfono está reproduciendo una canción."); |
| 46 | + } |
| 47 | +} |
| 48 | + |
| 49 | +impl Displayable for Phone { |
| 50 | + fn display(&self) { |
| 51 | + println!("El teléfono está mostrando la pantalla de reproducción."); |
| 52 | + } |
| 53 | +} |
| 54 | + |
| 55 | +/* |
| 56 | +//____________________________________ |
| 57 | +* EJERCICIO #2: |
| 58 | +'* Crea un gestor de impresoras. |
| 59 | +'* Requisitos: |
| 60 | +'* 1. Algunas impresoras sólo imprimen en blanco y negro. |
| 61 | +'* 2. Otras sólo a color. |
| 62 | +'* 3. Otras son multifunción, pueden imprimir, escanear y enviar fax. |
| 63 | +'* Instrucciones: |
| 64 | +'* 1. Implementa el sistema, con los diferentes tipos de impresoras y funciones. |
| 65 | +'* 2. Aplica el ISP a la implementación. |
| 66 | +'* 3. Desarrolla un código que compruebe que se cumple el principio. |
| 67 | +*/ |
| 68 | + |
| 69 | +//____________________________________ |
| 70 | +// Interfaces |
| 71 | +trait IPrinter { |
| 72 | + fn print_file(&self, file: &str); |
| 73 | +} |
| 74 | + |
| 75 | +trait IScanner { |
| 76 | + fn to_scan(&self, path_save: &str); |
| 77 | +} |
| 78 | + |
| 79 | +trait IFax { |
| 80 | + fn send_file(&self, file: &str, phone_number: i32); |
| 81 | +} |
| 82 | + |
| 83 | +//____________________________________ |
| 84 | +// Implementación |
| 85 | + |
| 86 | +struct MonoPrinter; |
| 87 | + |
| 88 | +impl IPrinter for MonoPrinter { |
| 89 | + fn print_file(&self, file: &str) { |
| 90 | + println!("\nImpresora blanco y negro:"); |
| 91 | + println!("{} se imprimió.", file); |
| 92 | + } |
| 93 | +} |
| 94 | + |
| 95 | +//____________________________________ |
| 96 | +struct ColorPrinter; |
| 97 | + |
| 98 | +impl IPrinter for ColorPrinter { |
| 99 | + fn print_file(&self, file: &str) { |
| 100 | + println!("\nImpresora a color:"); |
| 101 | + println!("{} se imprimió.", file); |
| 102 | + } |
| 103 | +} |
| 104 | + |
| 105 | +//____________________________________ |
| 106 | +struct Scanner; |
| 107 | + |
| 108 | +impl IScanner for Scanner { |
| 109 | + fn to_scan(&self, path_save: &str) { |
| 110 | + println!("\nEscaneo realizado, guardado en: {}", path_save); |
| 111 | + } |
| 112 | +} |
| 113 | + |
| 114 | +//____________________________________ |
| 115 | +struct Fax; |
| 116 | + |
| 117 | +impl IFax for Fax { |
| 118 | + fn send_file(&self, file: &str, phone_number: i32) { |
| 119 | + println!("\n{} fue enviado a: {}", file, phone_number); |
| 120 | + } |
| 121 | +} |
| 122 | + |
| 123 | +//____________________________________ |
| 124 | +struct MultiFunctionPrinter { |
| 125 | + mono_printer: MonoPrinter, |
| 126 | + color_printer: ColorPrinter, |
| 127 | + scanner: Scanner, |
| 128 | + fax: Fax, |
| 129 | +} |
| 130 | + |
| 131 | +impl MultiFunctionPrinter { |
| 132 | + fn new() -> Self { |
| 133 | + MultiFunctionPrinter { |
| 134 | + mono_printer: MonoPrinter, |
| 135 | + color_printer: ColorPrinter, |
| 136 | + scanner: Scanner, |
| 137 | + fax: Fax, |
| 138 | + } |
| 139 | + } |
| 140 | +} |
| 141 | + |
| 142 | +//____________________________________ |
| 143 | +fn main() { |
| 144 | + // exs 1 |
| 145 | + let speaker = Speaker; |
| 146 | + speaker.play(); |
| 147 | + |
| 148 | + let phone = Phone; |
| 149 | + phone.play(); |
| 150 | + phone.display(); |
| 151 | + |
| 152 | + //____________________________________ |
| 153 | + // exs 2 |
| 154 | + println!("\nExs #2"); |
| 155 | + |
| 156 | + // Individuales |
| 157 | + let mono_printer = MonoPrinter; |
| 158 | + mono_printer.print_file("filex.pdf"); |
| 159 | + |
| 160 | + let color_printer = ColorPrinter; |
| 161 | + color_printer.print_file("filex.pdf"); |
| 162 | + |
| 163 | + let scanner = Scanner; |
| 164 | + scanner.to_scan("c:\\docs"); |
| 165 | + |
| 166 | + let fax = Fax; |
| 167 | + fax.send_file("filex.pdf", 12345678); |
| 168 | + |
| 169 | + //____________________________________ |
| 170 | + println!("\n__________\nMultifunción"); |
| 171 | + let mfp = MultiFunctionPrinter::new(); |
| 172 | + |
| 173 | + mfp.mono_printer.print_file("filex.pdf"); |
| 174 | + mfp.color_printer.print_file("filex.pdf"); |
| 175 | + mfp.scanner.to_scan("c:\\docs"); |
| 176 | + mfp.fax.send_file("filex.pdF", 123456789); |
| 177 | + |
| 178 | +} |
0 commit comments