Quoi de mieux et pourquoi? (Du point de vue de la conception de l'interface):
a) Avoir deux Show()
et Hide()
fonctions
b) Avoir une SetVisible(bool visible)
fonction
EDIT: Par exemple, certains objets ont un état de visibilité et cette fonction est utilisée pour le changer.
c) Pour avoir tous les trois Show()
, Hide()
, SetVisible(bool visible)
fonctions
java
c++
interfaces
utilisateur3123061
la source
la source
Réponses:
Je préfère
SetVisible(bool visible)
, car cela me permet d'écrire le code client comme ceci:au lieu d'avoir à écrire
L'
SetVisible
approche peut également permettre une mise en œuvre plus facile. Par exemple, si une classe concrète particulière délègue simplement la méthode à ses classes composites, celaSetVisible
signifie une méthode de moins à implémenter.la source
MyObject.Visible = false;
me semble encore plus intuitif queMyObject.SetVisible(false);
SetVisible()
ne suggère pas (à moi) que vous affichez réellement quelque chose. Cela se lit plutôt comme si vous définissiez la propriété de visibilité d'un objet, en laissant éventuellement le soin à une méthodeRefresh()
ou correspondanteRedisplay()
de vérifier la valeur de cette propriété afin de déterminer si l'objet doit être affiché ou masqué.setVisible(true)
, un processus serait créé selon lequel l'objet serait dessiné lorsque le système serait inactif, voire avant. Je pense que celarefresh
pourrait être utile pour hâter l'affichage de l'objet, mais que l'objet serait finalement dessiné indépendamment (sauf si, par exemple, sa visibilité était définiefalse
avant).Je suis en désaccord avec toutes les affiches suggérant que plusieurs fonctions pour faire la même chose est une bonne chose. Alors que trois fonctions au lieu d'un peut ne pas sembler beaucoup ballonnement, rappelez - vous que votre classe est susceptible de se retrouver avec beaucoup de ces fonctions (par exemple
setEnabled
,enable
,disable
) et donc cette approche va se retrouver avec une grande interface plus grande classe. De plus, il est probable que vous obtiendrez un tas de fonctions / propriétés / similaires similaires dans votre classe et que la multiplication de fonctions obscurcira davantage le choix.Dans les langages qui supportent les propriétés, celles-ci devraient être préférées, mais comme ni Java ni C ++ ne le font, je suppose que c'est un point discutable.
Je pense que
setVisible()
devrait être préféré pour ces raisons:setVisible(false)
votre appelsetVisible(true)
alors que le contraire dehide()
pourrait être facilementreveal()
.setVisible(wantToSee)
plutôt que d'utiliser uneif
instruction.setX()
format se généralise afin que vous puissiez avoir un ensemble de fonctions cohérentes, tandis que l’approche verbed engendre une foule de fonctions qui peuvent être difficiles à localiser si vous ne savez pas ce que vous recherchez. La cohérence des API facilite considérablement leur apprentissage et leur mémorisation.la source
Cela dépend de ce que montrer et cacher signifie dans le contexte. D'abord, vous voulez savoir lequel est votre "voie principale" et vous concentrer sur le développement de cela:
setVisible(bool)
show()
ethide()
OK, alors maintenant que vous avez codé le noyau «standard d’or», vous devez déterminer s’il vaut la peine d’ajouter des méthodes simples dans l’autre style, afin de faciliter la vie de ceux qui vont utiliser votre objet.
setVisible(bool)
setVisible(a==b)
)show()
ethide()
onSuccess(widget.show)
)TLDR: Trouvez lequel est le plus important, mettez-le en œuvre, puis demandez-vous s'il vaut la peine d'ajouter l'autre style en tant que méthodes simples.
la source
Je dirais "tous les trois".
Show()
etHide()
ont tendance à être plus facile à parler queSetVisible(true)
etSetVisible(false)
. Toutefois, lorsque vous souhaitez définir la visibilité de manière logique, il est préférable d’avoir une méthode utilisant une méthodebool
plutôt qu’une constructionif
autour de celle-cibool
.Vous pouvez prendre en charge les trois sans dupliquer la logique et le passe-partout minimal:
Alternativement, si les choses que vous enveloppez ont une
SetVisible
API plus rapide:la source
System.Windows.Forms.Timer
. Personnellement, je trouve cela déroutant. Quand je vois les deuxShow
etSetVisible
, ma première tendance est de me demander s’il existe une différence importante entre les deux fonctions.Je préfère show () et hide (). En fait, chaque méthode qui reçoit un booléen peut être modifiée pour deux méthodes mieux exprimer l'intention de l'API. Par exemple, Robert Martin, dans un code épuré, recommande de préférer les méthodes avec zéro argument aux méthodes avec un seul argument.
Un autre argument important pour moi est la lisibilité. À mon avis, un bon code peut être lu comme une prose, c'est une prose vraiment étrange du genre "main_window setVisible false" au lieu de "main_window hide", vous écrivez ou parlez comme ça normalement ?, pourquoi utiliser cet étrange construction du langage dans les logiciels quand est-il parfaitement possible d'utiliser un langage plus naturel?.
la source
it.setVisible(false); it.setVisible(true);
n'affecte pas la visibilité du parent d'un contrôle, ni son ordre Z ni son emplacement. En revanche,hide(); show()
; plausiblement pourrait forcer le parent d'un contrôle à être visible, le déplacer au-dessus des autres contrôles et limiter sa position à un endroit visible. Dans certains cas, il est utile de disposer d'un moyen de s'assurer que quelque chose est réellement visible (comme avec ce qui précèdeshow()
, mais dans d'autres cas, il est utile de modifier l'indicateur de visibilité sans rien changer d'autre.Je pense que plus la méthode est expressive, plus le code sera lisible et, par conséquent, maintenable. Considérons les deux cas suivants:
Cas 1:
Cas 2:
Dans le premier cas, la fonction "setVisible" est claire, mais si vous voulez la lire, vous diriez:
Bien qu'il soit plus descriptif de dire:
ce qui modifiera la fonction "Cas 1" comme suit:
il produit plus de code, mais est plus lisible.
Le second cas a un défaut évident: vous savez déjà que vous souhaitez afficher le panneau, alors pourquoi ne pas utiliser la fonction "Afficher"?
Je ne dis pas que l'utilisation de "setVisible" est absolument fausse, mais cela devient confus lorsque vous essayez de lire du code que vous n'avez pas écrit au fil du temps et qu'il n'est pas conforme à la règle "Une fonction ne doit effectuer qu'une seule opération".
la source
show customer panel iff the user/customer is enabled
. Je conviens qu'il peut y avoir beaucoup de conditions plus complexes qui ne sont pas aussi faciles à lire que votre exemple, cependant, dans ces cas, je séparerais ces conditions en différentes lignes.Je crois que la
Hide()
/Show()
alternative est intéressante , car il est plus facile de comprendre ce qui se passe qu'avecSetVisible(true)
, tout en ayant une seule fonction est préférable car il évite beaucoup de conditionals.Si c'est le cas, je suggère d'utiliser une énumération comme entrée
SetVisible
, afin que vous obteniez l'unSetVisible(Visibility.Visible)
ou l' autreSetVisible(Visibility.Hidden)
. Vous avez une seule fonction que vous pouvez lire instantanément quelle action est entreprise.En utilisant les conventions de nommage de Java, vous auriez peut-être
setVisible(Visibility.VISIBLE)
ousetVisible(Visibility.HIDDEN)
.la source
Je suis d'accord avec la réponse de Darien, mais je voulais ajouter un point de vue du point de vue des programmeurs C #.
Quand je vois du code qui dit 'setXXX', je lis cela pour dire qu'il donne une valeur à une chose, je ne m'attends pas à ce que cela ait des effets secondaires sur cette chose à part définir cette valeur, et je pense que ce sera idempotent. (c.-à-d. que je peux continuer à le régler avec la même valeur et ce n'est pas grave). C'est un peu comme accéder à un champ. Généralement, je m'attendrais aussi à voir une méthode 'getXXX' avec un 'setXXX'.
Je ne sais pas si c'est ce à quoi vous vous attendiez en Java et en C ++, mais c'est ce à quoi je m'attendrais en C #, bien qu'en C #, il existe un raccourci pour cela appelé Propriétés. Et voici quelques conseils utiles sur l'utilisation des propriétés ( http://msdn.microsoft.com/en-us/library/ms182181.aspx ).
Compte tenu de ce point de vue, l'interface que je choisirais dépend uniquement des effets secondaires (autres que la modification de la valeur de ce champ):
Si cette action a des effets secondaires, par exemple si une boîte de dialogue est affichée, alors je choisirais "Show ()" et "Hide ()".
S'il n'a pas d'effets secondaires, si je règle la visibilité d'un "widget" et si un autre rendu le rend en fonction de son état, j'utiliserais setVisibility ou setIsVisible. (Je n'appellerais pas cela SetVisible).
En C # (pas sûr de Java), il est assez courant d’adopter un motif observateur, dans lequel un cadre d’interface utilisateur écoute les modifications apportées aux objets et restitue automatiquement l’interface utilisateur lorsqu’une propriété, telle que Visibility, change. Cela signifie que définir la valeur en appelant setIsVisible apparaît comme si elle avait des effets secondaires, mais pas dans ma définition. Le contrat du widget est rempli en définissant sa valeur de champ représentant "IsVisible".
En d'autres termes, je peux activer / désactiver la visibilité d'une étiquette sur un formulaire avant que celui-ci ne soit affiché. C'est-à-dire label.getIsVisible == true, mais le formulaire n'est pas affiché.
Je ne peux pas appeler Hide () lorsque le formulaire n'est pas affiché.
la source
getXXX()
et vossetXXX()
méthodes comme moyen d’accéder à un champ sans effets secondaires sonne comme en Java et non en C #. C'est la façon dont vous devez le faire en Java car il n'a pas de propriétés. Si je voyais un code comme celui-ci en C #, je suppose qu'il avait été écrit par un développeur Java qui n'avait pas encore appris à propos des propriétés en C #.SetVisibility
.getXX
appel a unesetXX
méthode correspondante , celasetYY
ne devrait pas l’affecter, mais cela peut affecter ungetZZ
appel qui n’a pas desetZZ
méthode.Je suggérerais une interface légèrement modifiée:
Meilleurs noms
Ces noms de méthodes aident le développeur à choisir la méthode à utiliser en fonction de ce qui doit être fait. Considérant que
SetVisible(bool visible)
peut confondre un développeur, car il transmet la même signification sémantique queShow()
etHide()
,Toggle()
implique l'existence d'une condition qui détermine l'action. Il devient donc intuitif pour le développeur d’utiliser chaque méthode.Redondance de code réduite
L'avantage d'avoir plusieurs méthodes dans votre interface est que cela simplifie le code d'appel. Vous pouvez simplement exposer
Show()
etHide()
, mais:SetVisible()
méthode privée pour faire le vrai travail dans les coulisses (ou écrire du code redondant pourShow()
etHide()
).SetVisible()
(ouToggle()
) déjà déjà afin d'éviter le gonflement du code (je déteste le code redondant). On duplique ainsi une méthode qui existe probablement déjà en tant que méthode privée dans la mise en œuvre.la source
Je suggérerais d'utiliser le
SetVisible(bool)
cas échéant uniquement si le fait de changer la visibilité deux fois (afficher et masquer, ou masquer et afficher à nouveau) laisserait les choses dans le même état qu'avant l'opération (c'est bien si afficher et masquer Quelque chose ou vice-versa laisse des objets nécessitant un redessin, à condition que l'on peut s'attendre à ce qu'il se produise "automatiquement"). Si masquer et afficher un objet n'aura d'autre effet que de changer un bit d'état, il serait logique que du code extérieur ait des méthodes acceptant un paramètre de visibilité, et l'écriture de ce code sera facilitéeSetVisible
.Si le fait de cacher et de montrer à nouveau un objet peut avoir des effets secondaires, tels que la modification de l'ordre des Z, ces actions doivent probablement être effectuées par des méthodes distinctes. Dans de tels cas, l'utilité des méthodes extérieures qui acceptent un paramètre de "visibilité" sera limitée, de sorte qu'il sera peu avantageux de les faciliter. De plus, une
SetVisible
méthode suggérera (à tort) que des changements dans la visibilité des objets peuvent être accomplis sans effets secondaires.la source