Implementé un algoritmo de derivación-yarda mejorado para analizar una expresión aritmética. Un aspecto del algoritmo es que mantiene un Queue
y un Stack
.Manera segura para almacenar dos tipos de objetos en una colección
En mi implementación, el Queue
contiene Expressions
y Operators
. El Stack
contiene Operators
y Parenthesis
.
Expressions
, Parenthesis
, y Operators
no tienen nada en común que garantice que dos de ellos tengan una interfaz compartida.
Enfoques:
Mi implementación actual consiste en
Expression
y la implementación de unOperator
INotParanthesis
.Operator
yParanthesis
implementan unINotExpression
. Luego declaroQueue <INotParanthesis>
yStack <INotExpression>
.No me gusta esta implementación: estas interfaces parecen un truco para el propósito de un código de algoritmo más limpio. También creo que las interfaces deben describir qué es un objeto, en oposición a lo que no es.
Por otro lado, tampoco quiero usar colecciones de
<Object>
, ya que puede ser difícil estar seguro de la exactitud de dicho código.El único que he encontrado, hasta ahora, es la implementación de mis propios contenedores
NonParanthesisQueue
yNonExpressionStack
. Esto tiene la ventaja de un control de tipo más consistente en los objetos que se extraen de esos contenedores, y la desventaja de tener muchos más códigos.
¿Hay alguna alternativa razonable a mi enfoque?
¡Gracias! Esto es exactamente lo que estaba buscando. – Vladislav
@Vladislav esto es similar a la respuesta de rationull (básicamente la idea es usar un tipo de tupla para contener datos heterogéneos) pero supongo que podría combinar las ideas de ambos para hacerlo aún más corto (digo esto porque te gusta que sea menos detallado). – nawfal