¿Buen uso de las funciones de envoltura?

7

¿Qué considera usted como buen uso de las funciones de envoltura? ¿Cuándo son abstracciones útiles y en qué casos la complejidad es perjudicial e innecesaria?

    
pregunta paldepind 25.04.2011 - 20:37

3 respuestas

16

Buenos usos para funciones de envoltura:

  1. Ocultando la complejidad de una API de bajo nivel horriblemente compleja o insegura, por ejemplo, la API de Win32. Sin embargo, su envoltorio debe reducir la complejidad y / o aumentar la seguridad de los casos comunes.

  2. Hacer algo multiplataforma cuando estás escribiendo una biblioteca genérica o tienes una buena razón para creer que debe ser multiplataforma.

Mal uso:

  1. Porque podemos.

  2. Porque quizás, en algún momento, podríamos cambiar a una nueva base de datos en nuestra aplicación rápida y sucia que estamos escribiendo.

  3. Porque, personalmente, no me gusta la API por alguna razón, aunque la envoltura no oculte ninguna complejidad.

respondido por el dsimcha 25.04.2011 - 20:45
3

Para ampliar la respuesta de @dsimcha (solo para dar ejemplos), normalmente envuelvo una serie de algoritmos C ++ STL, simplemente porque todos están diseñados en términos de iteradores, pero me parece que los llamo en toda la colección la mayoría del tiempo. / p>

Por lo tanto:

template <typename RndIt>
void sort(RndIt begin, RndIt end);

Se convierte en:

template <typename Container>
void sort(Container& c) { std::sort(c.begin(), c.end()); }

Pequeña ganancia, pero aún así:

  • No puedo desordenar y pasar el final primero y el segundo
  • Hace que el código de la persona que llama sea más legible

También puede ayudar a introducir controles de validez, por ejemplo, el algoritmo includes solo se puede llamar si ambas colecciones están ordenadas ...

template <typename Big, typename Small>
bool includes(Big const& big, Small const& small) {
  assert(std::is_sorted(big.begin(), big.end()) && "big not sorted");
  assert(std::is_sorted(small.begin(), small.end()) && "small not sorted");
  return std::includes(big.begin(), big.end(), small.begin(), small.end());
}

Por supuesto, usar la STL en modo de depuración probablemente realizaría esta verificación, dependiendo de la implementación ... o eso espero ... pero prefiero asegurarme :)

Y, finalmente, está la encarnación de expresiones idiomáticas simples. Por ejemplo, el borrado de elementos según un predicado en C ++ se puede hacer usando:

c.erase(std::remove_if(c.begin(), c.end(), pred), c.end());

Esto se puede resumir en:

template <typename Container, typename Pred>
void erase_if(Container& c, Pred pred);

para simplemente el código del llamante, y una vez más asegúrese de que no arruine los argumentos / idioma.

    
respondido por el Matthieu M. 26.04.2011 - 20:53
1

Solo mire cualquier plantilla del framework Spring

Eso es bueno envolver en acción.

Han tomado todos los casos de uso comunes para una amplia variedad de tecnologías JEE estándar (JPA, JMS, JAX-RS, JAXB, etc.) y han creado un conjunto de plantillas ordenadas que actúan como clases básicas simples desde las que se puede extender. Estas clases de plantillas simplifican enormemente los casos de uso simple de las bibliotecas y permiten a los desarrolladores realizar los conceptos básicos de manera muy fácil. Una vez que haya encontrado sus pies con la tecnología requerida, entonces puede explorar las otras clases base proporcionadas que envuelven las clases más sofisticadas.

Lo que los hace tan buenos es que todos siguen un enfoque muy similar, lo que significa que una vez que hayas colgado una plantilla, tendrás una buena ventaja en la siguiente.

    
respondido por el Gary Rowe 25.04.2011 - 20:59

Lea otras preguntas en las etiquetas