No tienes acceso a esta clase

隆Contin煤a aprendiendo! 脷nete y comienza a potenciar tu carrera

Generics en clases

22/25
Recursos

Aportes 18

Preguntas 0

Ordenar por:

驴Quieres ver m谩s aportes, preguntas y respuestas de la comunidad?

Literal pas茅 las 2 clases pregunt谩ndome por qu茅 esto era importante, hasta que la luz salvadora me ilumin贸 en un instante de raciocinio, y comprend铆 la magnitud de Generics. Sencillamente, wow.

驴Esto servir铆a para crear un Backend completo con Node? Si alguien tiene un ejemplo, se lo agradecer铆a.

Mi cerebro exploto, pero entendi muchas cosas con esta clase 馃槃

Vengo usando JS para el backend pero con esto pues no hay pierde. Me cambio a usar TS desde ahora. jeje

Tambien se puede escribir usando la convencion de nombres para genericos, que es comunmente con lo que te vas a topar

export class BaseHttpService<T> {

  constructor(
    private url: string
  ){}

  async getAll(): Promise<T[]> {
    const { data } = await axios.get<T[]>(this.url);
    return data;
  }
}

Tambi茅n se puede capturar el resultado de una promesa de este modo, para no hacer la funci贸n auto-invocada:

const url1 = "https://api.escuelajs.co/api/v1/products";

const productService = new BaseHttpService<Product>(url1);

productService.getAll().then(console.log);

Creo entender, usando la misma clase se hacen diferentes peticiones al servidor de diferentes entidades, lo que cambiar铆a es el tipado o gen茅rico que le apliquemos a dicha clase, con esto se ahorrar铆a la generaci贸n de una clase para cada entidad y varios m茅todos crud para cada entidad, lo cual ahorrar铆a mucho en materia de l铆neas de c贸digo. Pero me surge una pregunta: 驴Hasta qu茅 punto esto es beneficioso, ya que separar la l贸gica aparte de tener mayor claridad conserva el principio de una sola responsabilidad .? Si por alguna razon esta clase falla que ser铆a la unica, fallar铆a toda la estructura relacionada con esa clase, por el contrario separando la l贸gica en diferentes clases mitigar铆a de cierta forma alg煤n error que se presente en alguna clase especifica. Por otro lado las clases son representaciones abstractas del mundo real por ende cada entidad del mundo real, se representa como una clase por separado, entonces, se podr铆a decir que separar las clases es algo mas cercano al mundo real. Entonces deben haber casos espec铆ficos donde se usen este tipo de gen茅ricos . O NO, NO SE. solo son conjeturas m铆as, no soy experto. alguien que sepa mas que yo que me oriente por favor.

Ser铆a mucho mejor pasar la url en el m茅todo, y no el constructor, ya que si transformamos nuestro servicio a un singleton, la segunda instanacia del servicio, la url no la tomar铆a.

Una Clase elegante, poderosa la utilidad de los generics cuando lo entiendes.

Llevo dos horas intentando entender los gen茅ricos. Hasta que me carburo el cerebro y por arte de magia lo entend铆 :0

Aqu铆 tienes un ejemplo de c贸mo implementar el patr贸n Singleton en TypeScript para la clase BaseHttpService:

import axios from 'axios';

export class BaseHttpService<TypeClass> {
  private static instance: BaseHttpService<any>;
  private url: string;

  private constructor(url: string) {
    this.url = url;
  }

  public static getInstance<TypeClass>(url: string): BaseHttpService<TypeClass> {
    if (!BaseHttpService.instance) {
      BaseHttpService.instance = new BaseHttpService<TypeClass>(url);
    }
    return BaseHttpService.instance;
  }

  async getAll() {
    const { data } = await axios.get<TypeClass[]>(this.url);
    return data;
  }

  async update(id: string, changes: Partial<TypeClass>) {
    const { data } = await axios.put(`${this.url}/${id}`, changes);
    return data;
  }

  async create(dto: TypeClass) {
    const { data } = await axios.post(this.url, dto);
    return data;
  }

  async findOne(id: string) {
    const { data } = await axios.get(`${this.url}/${id}`);
    return data;
  }

  async delete(id: string) {
    const { data } = await axios.delete(`${this.url}/${id}`);
    return data;
  }
}

En este ejemplo, hemos agregado un m茅todo est谩tico llamado getInstance que se encarga de crear y mantener una 煤nica instancia de la clase BaseHttpService. El constructor de la clase es privado, lo que significa que no se puede acceder directamente a 茅l desde fuera de la clase. Esto evita que se creen m煤ltiples instancias de BaseHttpService y garantiza que siempre se utilice la misma instancia en todo el c贸digo.
.
Ahora, veamos por qu茅 es bueno utilizar el patr贸n Singleton:

  1. Garantiza una 煤nica instancia: El patr贸n Singleton asegura que solo haya una instancia de una clase determinada en todo el programa. Esto puede ser 煤til cuando se necesita un objeto 煤nico para coordinar acciones en diferentes partes del c贸digo.

  2. Acceso global: Al utilizar el patr贸n Singleton, la instancia 煤nica se vuelve accesible globalmente desde cualquier parte del programa. Esto simplifica el acceso a la funcionalidad proporcionada por la clase, ya que no es necesario pasar la instancia entre diferentes componentes o clases.

  3. Mantiene el estado: Si la clase Singleton tiene estado, este estado se mantiene a lo largo de todo el ciclo de vida de la aplicaci贸n. Esto puede ser 煤til cuando se necesita mantener informaci贸n o configuraciones espec铆ficas en un solo lugar y compartirlas en diferentes partes del programa.

  4. Promueve el acoplamiento d茅bil: Al utilizar el patr贸n Singleton, los componentes o clases que dependen de la instancia no necesitan conocer los detalles de c贸mo se crea o se mantiene esa instancia. Solo necesitan solicitar la instancia al Singleton, lo que promueve un acoplamiento d茅bil y facilita la modificaci贸n o sustituci贸n de la implementaci贸n del Singleton en el futuro.

.
Sin embargo, es importante tener en cuenta que el patr贸n Singleton tambi茅n puede tener algunas desventajas. Por ejemplo, puede dificultar las pruebas unitarias, ya que la dependencia de la instancia 煤nica puede ser dif铆cil de simular o reemplazar en las pruebas. Adem谩s, el uso excesivo del patr贸n Singleton puede ocultar dependencias y dificultar la comprensi贸n del flujo de datos y la arquitectura general del programa.
.
Por lo tanto, es recomendable utilizar el patr贸n Singleton con moderaci贸n y evaluar cuidadosamente si es la mejor soluci贸n para el problema espec铆fico que se est谩 abordando.

Personalizando la clase en execution time.

Parece que ya no sirve la api 馃槙

Los gen茅ricos son lo mejor

馃く馃く馃く

Typescript the best馃挋

Tuve que mirar la clases dos veces para poder entender un poco m谩s acerda de la clases generics pero aqu铆 est谩 el resumen que pude sacar

RESUMEN:
Este es un servivio generico que podemos utilizar solamente pasando el tipo de dato
que queremos utulizar o hacer request, eso nos ahorraria hacer un servicio para
productos, categorias, usuarios etc鈥

Mi aporte:

import axios from 'axios';
import { Category } from '../models/category.model';
import { Product } from '../models/product.model';


export class BaseHttpService<TypeClass> {
  // data: TypeClass[] = [];
  constructor (private url: string) {}

  async getAll(): Promise<TypeClass[]> {
    const { data } = await axios.get<TypeClass[]>(this.url);
    return data;
  }

}

(async () => {
  const URL_PRODUCTS = 'https://api.escuelajs.co/api/v1/products'
  const URL_CATEGORIES = 'https://api.escuelajs.co/api/v1/categories'
  
  const productService = new BaseHttpService<Product>(URL_PRODUCTS);
  const categoryService = new BaseHttpService<Category>(URL_CATEGORIES);
  
  const products = await productService.getAll()
  const categories = await categoryService.getAll()

  
  console.log('products: >>>> ', products.length);
  console.log('categories: >>>> ', categories.length);
})()

Generics en clases

import axios from "axios";

import { Category } from "./models/category.model";
import { Product } from "./models/product.model";

export class BaseHttpService<TypeClass> {
  constructor(
    private url: string,
  ) { }

  async getAll() {
    const { data } = await axios.get<TypeClass[]>(this.url)
    return data;
  }
}

(async()=> {
  const url1 = 'https://api.escuelajs.co/api/v1/products'

  const productService = new BaseHttpService<Product>(url1)
  const rta = await productService.getAll()
  console.log('products: ', rta.length)

  const url2 = 'https://api.escuelajs.co/api/v1/categories'
  const categoryService = new BaseHttpService<Category>(url2)
  const rta2 = await categoryService.getAll()
  console.log('categories: ', rta2.length)
})()