Convenciones de nomenclatura de elementos de interfaz de usuario de WPF


Aunque La notación húngara se considera una mala práctica hoy en día, todavía es bastante común codificar el tipo en el nombre de elementos de la interfaz de usuario , ya sea utilizando un prefijo (lblTitle, txtFirstName, ...) o un sufijo (TitleLabel, FirstNameTextBox, ...).

En mi empresa, también hacemos esto, ya que hace que el código escrito por compañeros de trabajo (o por ti mismo hace mucho tiempo) sea más fácil de leer (en mi experiencia). El argumento que se suele plantear en contra de hacer esto have tienes que cambiar el nombre de la variable if the type changes -- no es muy fuerte, ya que cambiar el tipo de un elemento de interfaz de usuario generalmente requiere reescribir todas las partes del código donde se hace referencia de todos modos.

Por lo tanto, estoy pensando en mantener esta práctica al comenzar con el desarrollo de WPF (hmmm... ¿deberíamos usar el prefijo txt para bloques de texto o cuadros de texto?). ¿Hay alguna gran desventaja que me haya pasado por alto? Esta es tu oportunidad de decir " No hagas esto, porque ...".

EDITAR: Sé que con databinding la necesidad para nombrar los elementos de la interfaz de usuario disminuye. Sin embargo, a veces es necesario, por ejemplo, al desarrollar controles personalizados...

Author: ThinkingStiff, 2009-11-16

8 answers

Personalmente, encuentro que WPF cambia las reglas cuando se trata de esto. A menudo, puede salirse con la suya con poco o ningún código detrás, por lo que tener los prefijos para distinguir los nombres hace que las cosas sean más confusas en lugar de menos confusas.

En Windows Forms, cada control se referenciaba por nombre en código. Con una interfaz de usuario grande, la notación semi-húngara era útil-era más fácil distinguir con qué se estaba trabajando.

En WPF, sin embargo, es un control raro que necesita un nombre. Cuando tiene que acceder a un control a través de código, a menudo es mejor usar propiedades o comportamientos adjuntos para hacerlo, en cuyo caso nunca está tratando con más de un solo control. Si estás trabajando en el control de usuario o detrás del código de la ventana, solo usaría "Título" y "Nombre" en lugar de "txtTitle", especialmente porque ahora probablemente solo tendrás que lidiar con unos pocos controles limitados, en lugar de todos ellos.

Incluso los controles personalizados no deberían necesitar nombres, en la mayoría de los casos. Querrás nombres con plantillas siguiendo la convención (ie: PART_Name), pero no los elementos x:Name reales para sus UIs...

 30
Author: Reed Copsey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-11-16 17:22:43

En mi experiencia - En WPF cuando cambias el tipo de un control, normalmente no tienes que reescribir ningún código a menos que hayas hecho algo mal. De hecho, la mayoría de las veces no hace referencia a los controles en el código. Sí, terminas haciéndolo, pero la mayoría de las referencias a un elemento UI en WPF son por otros elementos en el mismo XAML.

Y personalmente, encuentro "lblTitle, lblCompany, txtFirstName" más difícil de leer que "Title". No tengo .intWidth y .En la noche (adiós ¡ipzstrName!). Por qué lo has hecho .¿Primer nombre? Puedo entender TitleField o TitleInput o lo que sea mucho más, ya que es descriptivo del qué, no del cómo.

Para mí, desear tener ese tipo de separación normalmente significa que mi código de interfaz de usuario está tratando de hacer demasiado - por supuesto, se trata de un elemento de interfaz de usuario, está en el código de la ventana! Si no estoy tratando con código alrededor de un elemento de interfaz de usuario, ¿por qué en el mundo lo estaría codificando aquí?

 13
Author: Philip Rieck,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-11-16 17:14:51

Me gusta usar una convención (solo una buena idea en general), pero para cosas de IU me gusta tener el tipo del control en la parte delantera, seguido del nombre descriptivo Lab LabelSummary, TextSummary, CheckboxIsValid, etc.

Suena menor, pero la razón principal para poner el tipo primero es que aparecerán juntos en la lista Intellisense all todas las etiquetas juntas, casillas de verificación, y así sucesivamente.

 6
Author: Jeff Donnici,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-11-16 17:14:28

Incluso desde una perspectiva Winforms no me gusta semi-húngaro.

La mayor desventaja en mi opinión, y he escrito mucho código de interfaz de usuario es que el húngaro hace que los errores sean más difíciles de detectar. El compilador generalmente lo recogerá si intenta cambiar la propiedad marcada en un cuadro de texto, pero no captará algo como:

lblSomeThing.Visible = someControlsVisible;
txtWhatThing.Visible = someControlsVisible;
pbSomeThing.Visible = someControlsVisible;

Me resulta mucho más fácil depurar:

someThingLabel.Visible = someControlsVisible;
whatThingTextBox.Visible = someControlsVisible;
someThingPictureBox.Visible = someControlsVisible;

También creo que es mucho mejor agrupar un addCommentsButton con un addCommentsTextBox que agrupar a btnAddComments con una ventana btnCloseWindow. ¿Cuándo vas a usar los dos últimos juntos?

En cuanto a encontrar el control que quiero, estoy de acuerdo con Philip Rieck. A menudo quiero tratar con todos los controles que se relacionan con un concepto lógico en particular (como título, o agregar comentarios). Casi nunca quiero encontrar cualquiera o todos los cuadros de texto que pasan a estar en este control.

Es posiblemente irrelevante en WPF, pero creo que el húngaro debe evitarse en todo momento.

 4
Author: Justin Doyle,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-09-02 05:23:04

De acuerdo con las otras respuestas que es principalmente preferencia personal, y lo más importante es solo para ser consistente.

Sobre la necesidad de nombrar en absoluto, dada la prevalencia de la unión de datos... una cosa que podría considerar es si su interfaz de usuario alguna vez está sujeta a pruebas automatizadas. Algo como QTP encuentra los elementos visuales en una aplicación por Nombre, por lo que un ingeniero de automatización que escribe scripts de prueba apreciará mucho cuando cosas como pestañas, botones, etc. (cualquier control interactivo) están todos bien nombrados.

 2
Author: Lyall,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-02-03 13:40:14

En WPF prácticamente nunca necesitas (o incluso quieres) nombrar tus controles. Por lo tanto, si está utilizando las mejores prácticas de WPF, no importará cómo llamaría a sus controles si tuviera una razón para nombrarlos.

En esas raras ocasiones en las que realmente desea dar un nombre a un control (por ejemplo, para una referencia ElementName= o TargetName=), prefiero elegir un nombre que describa en función del propósito del nombre, por ejemplo:

<Border x:Name="hilightArea" ...>
   ...

<DataTrigger>
   ...
   <Setter TargetName="hilightArea" ...
 1
Author: Ray Burns,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-11-16 17:35:37

Prefijo cualquier nombre de interfaz de usuario con dos guiones bajos, como en __ por lo que se ordena antes que otras propiedades al depurar. Cuando necesito usar IntelliSense para encontrar un control, simplemente escribo __ y se muestra una lista de controles. Esto continúa la convención de nomenclatura de prefijar un solo subrayado a las variables de nivel de módulo, como en int _id;.

 1
Author: AMissico,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-06-13 19:10:54

Puede utilizar el sitio web oficial de Microsoft para las convenciones de nomenclatura de control de Visual Basic 6, y tal vez combinarlo con las convenciones de nomenclatura recomendadas de C#. Es muy específico, es ampliamente utilizado por los desarrolladores en C#, así como para los nombres de control, y todavía se puede utilizar en un contexto WPF o Windows Forms.

Visual Basic 6 control naming conventions: Object Naming Conventions

C# convenciones de nomenclatura recomendadas en general: Convenciones de nomenclatura generales

 1
Author: Mathias Lykkegaard Lorenzen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-11-04 07:39:30