El principio de Abierto/Cerrado (Open/Closed Principle) es un concepto fundamental en la programación orientada a objetos, que establece que las clases deben estar abiertas para la extensión pero cerradas para la modificación. Esto significa que una clase debe permitir la adición de nuevas funcionalidades sin necesidad de alterar su código fuente existente, promoviendo así la reutilización y la robustez del código.
Por ejemplo, considere una clase encargada de realizar conexiones HTTP. En lugar de modificar directamente esta clase para cambiar la implementación de las conexiones, podemos utilizar una interfaz o una clase base que defina el comportamiento esperado. Luego, podemos crear nuevas clases que extiendan esta funcionalidad. Aquí le muestro un ejemplo práctico utilizando la biblioteca Axios en JavaScript
import { PhotosService, PostService, TodoService } from './service';
import { HttpClient } from './http';
(async () => {
const httpClient = new HttpClient();
const todoService = new TodoService( httpClient );
const postService = new PostService( httpClient );
const photosService = new PhotosService( httpClient );
const todos = await todoService.getTodoItems();
const posts = await postService.getPosts();
const photos = await photosService.getPhotos();
console.log({ todos, posts, photos });
})();
import { HttpClient } from './http';
export class TodoService {
constructor( private http: HttpClient ){}
async getTodoItems() {
const { data } = await this.http.get('https://jsonplaceholder.typicode.com/todos/');
return data;
}
}
export class PostService {
constructor( private http: HttpClient ){}
async getPosts() {
const { data } = await this.http.get('https://jsonplaceholder.typicode.com/posts');
return data;
}
}
export class PhotosService {
constructor( private http: HttpClient ){}
async getPhotos() {
const { data } = await this.http.get('https://jsonplaceholder.typicode.com/photos');
return data;
}
}
// import axios from 'axios';
export class HttpClient {
// async get( url: string ) {
// const { data, status } = await axios.get(url);
// return { data, status };
// }
async get( url: string ) {
const resp = await fetch( url );
const data = await resp.json();
return { data, status: resp.status };
}
}