Parece más fácil ser genérico en el pequeño, es decir, no haga una clase para manejar una tabla de búsqueda que asigne enteros a cadenas cuando puede hacer una clase de diccionario razonable que maneje cualquier par de tipos (donde el primer tipo admite algún tipo de comparación).
En una vida anterior, hice muchos proyectos de automatización industrial para maquinaria que manejaba una red continua de material. Acero, aluminio, papel, plástico, .... Lo desenrollas en un extremo y lo enrollas nuevamente en el otro después de hacer algo útil en el medio. En una industria, comienza en el "carrete de pago", no en el "desenrollador". Si usa la terminología incorrecta, entonces es un idiota a los ojos de varios millones de dólares del cliente. Te sorprendería lo poco que se puede abstraer para la reutilización de un proyecto a otro. OTOH, a menudo se puede crear un marco o plantilla como punto de partida. Se personalizaría para el trabajo en cuestión, pero al menos tenía el beneficio de aprender de proyectos anteriores. Y todos en el equipo sabían desde dónde comenzábamos.