Aquí están mis comentarios convertidos en una respuesta.
-
1) ¿Es realmente necesaria la interfaz para lo que estoy haciendo aquí, especialmente dado que es muy poco probable que haya pruebas unitarias para la lógica? La razón principal por la que la creé es que parece ser la forma recomendada para clases/métodos públicos.
No abstraería si no hay razón para hacerlo. Las recomendaciones existen solo por buenas razones y no creo que se aplique a tu caso.
-
2) ¿Tiene sentido el nombre de las diferentes entidades?
Si tienes una buena razón para usar una interfaz, renombraría DAO a DB (supongo que DB es más conocido que DAO), y la instancia también debería mantener DB: db_zparameters. Nota: No soy fan de la notación húngara prefijada.
-
3) ¿Cómo hacer que el proceso llamador sepa que es posible que no se encuentre ninguna entrada en RETURN_VALUE2 en un método funcional que solo devuelve exactamente un valor, en este caso el contenido de VALUE2? En este momento, lo resuelvo consultando si VALUE2 está lleno, pero no estoy seguro de si esa es la mejor/manera correcta de hacerlo.
Para devolver la información encontrada/no encontrada, depende de ti.
a) El uso del valor inicial no me molesta, acompañado de un comentario.
b) El uso de una excepción también podría ser válido.
c) El uso de una referencia, para devolver algún dato o NULL significando no encontrado en tu caso.
Definición:
METHODS
return_value2
IMPORTING
i_zparameters TYPE zparameters
RETURNING
VALUE(result) TYPE REF TO zparameters-value2.
Implementación:
METHOD zif_table_zparameters_dao~return_value2.
SELECT SINGLE value2
FROM zparameters
INTO @DATA(value2)
WHERE modul EQ @i_zparameters-modul
AND z_program EQ @i_zparameters-z_program
AND field EQ @i_zparameters-field
AND value1 EQ @i_zparameters-value1.
IF sy-subrc = 0.
result = NEW #( value2 ).
ENDIF.
ENDMETHOD.
Uso:
DATA(value2) = int_zparameters->return_value2( VALUE