¿Qué es mejor y por qué? (Desde el punto de vista del diseño de la interfaz):
a) Tener dos Show()
y Hide()
funciones
b) Tener una SetVisible(bool visible)
función
EDITAR: Por ejemplo, algún objeto tiene estado de visibilidad y esta función se utiliza para cambiarlo.
c) tener los tres Show()
, Hide()
, SetVisible(bool visible)
funciones
java
c++
interfaces
usuario3123061
fuente
fuente
Respuestas:
Prefiero
SetVisible(bool visible)
, porque me permite escribir código de cliente como este:en lugar de tener que escribir
El
SetVisible
enfoque también puede permitir una implementación más fácil. Por ejemplo, si una clase concreta en particular simplemente delega el método a sus clases compuestas,SetVisible
significa un método menos para implementar.fuente
MyObject.Visible = false;
me parece aún más intuitivo queMyObject.SetVisible(false);
SetVisible()
no sugiere (para mí) que en realidad esté mostrando algo. Se lee más como si estuviera configurando la propiedad de visibilidad de un objeto, posiblemente dejándolo en un métodoRefresh()
oRedisplay()
método correspondiente para verificar el valor de esta propiedad para determinar si el objeto debe mostrarse u ocultarse.setVisible(true)
pondría en marcha un proceso en el que el objeto se dibujaría cuando el sistema estuviera inactivo la próxima vez, si no antes. Esperaría querefresh
pudiera ser útil para acelerar la visualización del objeto, pero que el objeto eventualmente se dibujaría independientemente (a menos que, por ejemplo, su visibilidad fuera establecidafalse
antes de que eso ocurriera).No estoy de acuerdo con todos los carteles que sugieren que múltiples funciones para hacer lo mismo es algo bueno. Mientras tres funciones en lugar de uno pueden no parecer mucho, hinchazón, recuerde que su clase es probable que terminan con muchas de esas funciones (por ejemplo
setEnabled
,enable
,disable
) y por lo tanto este enfoque va a terminar con una gran interfaz de la clase más grande. Además, es probable que termines con un montón de funciones / propiedades de sonido similares / lo que sea en tu clase y la multiplicación de funciones oscurecerá aún más cuál va con qué.En los lenguajes que admiten propiedades, estos deberían ser preferidos, pero como Java o C ++ no lo hacen, supongo que es un punto discutible.
Creo que
setVisible()
debería preferirse por estos motivos:setVisible(false)
tu llamada,setVisible(true)
mientras que lo contrario dehide()
podría ser fácilmentereveal()
.setVisible(wantToSee)
lugar de usar unaif
declaración.setX()
formato se generaliza para que pueda tener un conjunto de funciones consistentes, mientras que el enfoque verbed genera una serie de funciones que pueden ser difíciles de localizar si no sabe lo que está buscando. La consistencia en las API las hace considerablemente más fáciles de aprender y recordar.fuente
Depende de qué mostrar y ocultar significa en el contexto. Primero, desea averiguar cuál es su "camino principal" y centrarse en desarrollar eso:
setVisible(bool)
show()
yhide()
Bien, ahora que ha codificado el núcleo del "estándar de oro", debe averiguar si vale la pena agregar métodos de conveniencia delgados en el otro estilo, para facilitar la vida de quien vaya a usar su objeto.
setVisible(bool)
setVisible(a==b)
)show()
yhide()
onSuccess(widget.show)
)TLDR: descubra cuál es el más importante, impleméntelo y luego pregúntese si vale la pena agregar el otro estilo como métodos convenientes.
fuente
Yo diría "los tres".
Show()
yHide()
tienden a ser más fáciles de asimilar queSetVisible(true)
ySetVisible(false)
. Sin embargo, cuando desea establecer la visibilidad de forma lógica, es mejor tener un método que tomebool
unif
entorno en lugar de construirlobool
.Puede admitir los tres sin duplicar la lógica y un mínimo repetitivo:
Alternativamente, si las cosas que está envolviendo tienen una
SetVisible
API más -ish:fuente
System.Windows.Forms.Timer
. Personalmente, me parece confuso. Cuando veo ambosShow
ySetVisible
, mi primera inclinación es preguntarme si hay alguna diferencia importante entre las dos funciones.Prefiero show () y hide (), de hecho, cada método que recibe un booleano se puede cambiar por dos métodos para expresar mejor la intención de la API. Por ejemplo, Robert Martin en código limpio recomienda métodos preferidos con cero argumentos sobre métodos con un argumento.
Otro argumento importante para mí es la legibilidad, en mi opinión, un buen código se puede leer como prosa, es una prosa realmente extraña, algo así como "main_window setVisible false" en lugar de "main_window hide", ¿escribe o habla así normalmente ?, ¿por qué usar este extraño? ¿La construcción del lenguaje en programas de software cuando es perfectamente posible utilizar un lenguaje más natural?
fuente
it.setVisible(false); it.setVisible(true);
no afectara la visibilidad de los padres del control, ni debería afectar el orden Z o la ubicación del control. Por el contrariohide(); show()
; podría forzar de manera plausible que el padre de un control sea visible, moverlo sobre otros controles y limitar su posición a un lugar que pueda verse. En algunos casos, es útil tener un medio para asegurarse de que algo sea realmente visible (como con lo mencionado anteriormenteshow()
, pero en otros casos es útil cambiar la bandera de visibilidad sin cambiar nada más.)Creo que cuanto más expresivo sea el método, más legible y, en consecuencia, sostenible, será el código. Considere los siguientes dos casos:
Caso 1:
Caso 2:
En el primer caso, está claro qué está haciendo la función "setVisible", pero si desea leerla, diría:
Si bien es más descriptivo decir:
que cambiará la función "Caso 1" a la siguiente:
Produce más código, pero es más legible.
El segundo caso tiene una falla obvia, que ya sabe que desea mostrar el panel, entonces, ¿por qué no usar la función "Mostrar"?
No estoy diciendo que usar "setVisible" sea absolutamente incorrecto, pero se vuelve confuso cuando intentas leer el código que no escribiste a lo largo del tiempo, y no se ajusta a la regla "Una función debe realizar una sola operación".
fuente
show customer panel iff the user/customer is enabled
. Estoy de acuerdo en que puede haber muchas condiciones más complejas que no son tan fáciles de leer como su ejemplo, sin embargo, en esos casos, dividiría esas condiciones en diferentes líneas.Creo que la alternativa
Hide()
/Show()
es atractiva porque es más fácil de entender lo que está sucediendo que conSetVisible(true)
, mientras que tener una sola función es preferible porque evita muchos condicionales.Si ese es el caso, sugiero usar una enumeración como entrada para
SetVisible
que obtengaSetVisible(Visibility.Visible)
oSetVisible(Visibility.Hidden)
. Tiene una única función: puede leer instantáneamente qué acción se está tomando.Usando las convenciones de nomenclatura de Java, tendría quizás
setVisible(Visibility.VISIBLE)
osetVisible(Visibility.HIDDEN)
.fuente
Estoy de acuerdo con la respuesta de Darien, pero quería agregar un punto de vista desde la perspectiva de los programadores de C #.
Cuando veo un código que dice 'setXXX', lo leo para decir que está estableciendo un valor en una cosa, no espero que tenga efectos secundarios en esa cosa que no sea establecer ese valor, y espero que esto sea idempotente (es decir, puedo seguir configurándolo con el mismo valor y está bien). Es más bien como acceder a un campo. En general, también esperaría ver un método 'getXXX' junto con un 'setXXX'.
No sé si esto es lo que esperas en Java y C ++, pero eso es lo que esperaría en C #, aunque en C # hay una pequeña mano para esto llamada Propiedades. Y aquí hay una buena guía sobre cómo usar Propiedades ( http://msdn.microsoft.com/en-us/library/ms182181.aspx ).
Dada esta vista, la interfaz que elegiría depende únicamente de si hay algún efecto secundario (además de cambiar el valor de ese campo):
Si realizar la acción tiene efectos secundarios, por ejemplo, se muestra un cuadro de diálogo, iría con "Mostrar ()" y "Ocultar ()".
Si no tiene efectos secundarios, digamos que estoy configurando la visibilidad de un "widget" y algo más representa ese widget dependiendo de su estado, entonces usaría setVisibility o setIsVisible. (No lo llamaría SetVisible).
En C # (no estoy seguro acerca de Java) es bastante común adoptar un patrón de observador, donde un marco de la interfaz de usuario escuchará los cambios en los objetos y volverá a representar automáticamente la interfaz de usuario cuando cambie una propiedad como Visibilidad. Eso significa que establecer el valor al llamar a setIsVisible parece tener efectos secundarios, pero en mi definición no lo tiene. El contrato del widget se cumple estableciendo su valor de campo que representa "IsVisible".
Dicho de otra manera, está bien para mí alternar la visibilidad de una etiqueta en un formulario antes de que se muestre el formulario. Es decir, label.getIsVisible == verdadero, pero el formulario no se muestra.
No está bien que llame a Hide () cuando no se muestra el formulario.
fuente
getXXX()
ysetXXX()
métodos como una forma de acceder a un campo sin efectos secundarios suena como Java y no C #. Esta es la forma en que debe hacerlo en Java porque no tiene propiedades. Si vi un código así en C #, supongo que fue escrito por un desarrollador de Java que aún no había aprendido sobre las propiedades en C #.SetVisibility
.getXX
llamada tiene unsetXX
método correspondiente ,setYY
no debería afectarlo, pero puede afectar unagetZZ
llamada que no tiene unsetZZ
método.Sugeriría una interfaz ligeramente modificada:
Mejores nombres
Estos nombres de métodos ayudan al desarrollador a decidir qué método usar en función de lo que debe hacerse. Mientras que
SetVisible(bool visible)
puede confundir a un desarrollador porque transmite el mismo significado semántico queShow()
eHide()
,Toggle()
implica la existencia de una condición que determina la acción. Por lo tanto, se vuelve intuitivo para el desarrollador cuándo usar cada método.Redundancia de código reducida
El beneficio de tener múltiples métodos en su interfaz es que simplifica el código de llamada. Podrías exponer
Show()
yHide()
, pero:SetVisible()
método privado para hacer el trabajo real detrás de escena (o escribir código redundante paraShow()
yHide()
).SetVisible()
(oToggle()
) ya hace para evitar la acumulación de código (odio el código redundante). Por lo tanto, duplicar un método que probablemente ya existe como método privado en la implementación.fuente
Sugeriría usar,
SetVisible(bool)
si lo hubiera, solo si alterna la visibilidad dos veces (mostrar y volver a ocultar, u ocultar y volver a mostrar) dejaría las cosas esencialmente en el mismo estado que antes de que se realizara la operación (está bien si se muestra y se vuelve a ocultar algo o viceversa deja objetos que necesitan un redibujo, siempre que se pueda esperar que suceda "automáticamente"). Si esconder y mostrar un objeto no tendrá otro efecto que cambiar un bit de estado, entonces tendría sentido para el código externo tener algunos métodos que acepten un parámetro de visibilidad, y la escritura de dicho código se facilitaráSetVisible
.Si ocultar y volver a mostrar un objeto puede tener efectos secundarios, como cambiar el orden Z, es más probable que tales acciones se realicen por métodos separados. En tales casos, la utilidad de los métodos externos que aceptan un parámetro de "visibilidad" será limitada y, por lo tanto, habrá pocas ventajas para facilitarlos. Además, un
SetVisible
método sugerirá (erróneamente) que los cambios en la visibilidad de los objetos se pueden lograr sin efectos secundarios.fuente