Pregunta

A menudo escucho a la gente alabanza idiomas, marcos, construcciones, etc.para ser "explícito".Estoy tratando de entender esta lógica.El propósito de un lenguaje, framework, etc.es para ocultar la complejidad.Si usted especificar todo tipo de detalles de forma explícita, no se trata de ocultar mucho complejidad, sólo se desplazan alrededor.¿Qué tan grande sobre lo explícito y cómo hacer un lenguaje/framework/API "explícito" a pesar de lo que es servir a su propósito de ocultar la complejidad?

¿Fue útil?

Solución

No es tanto que explícito es bueno (sin duda, el relacionado detallado es malo) ya que cuando implícito va mal, es tan difícil decir WTF que está pasando.

Hack de C++ para una década o dos, y vas a entender exactamente a qué me refiero.

Otros consejos

Si usted debe ser explícita o implícita, depende de la situación.Estás en lo correcto en que a menudo usted está tratando de ocultar la complejidad, y ciertas cosas que se realiza detrás de las escenas para que automáticamente es bueno.la encapsulación, etc.

Sin embargo, a veces los marcos o construcciones de ocultar cosas de nosotros que no deben, y esto hace las cosas menos claro.A veces, cierta información o se oculta la configuración de nosotros y por eso nos no sé lo que está pasando.Se realizan suposiciones que no entendemos y no se puede determinar.Comportamientos suceder que no podemos predecir.

Encapsulación:bueno.Ocultar:malo.Hacer la decisión correcta, toma la experiencia.Donde la lógica pertenece, debe ser explícita.

Ejemplo: Yo una vez eliminado cerca de 90 líneas de código a partir de una serie de una docena de código detrás de las páginas;código de acceso a datos, lógica de negocio, etc., que no pertenecen allí.Me mudé a base de páginas y la clave del objeto de negocio.Este fue bueno (encapsulación, la separación de los problemas, la organización del código, la disociación, etc.).

Yo luego con entusiasmo di cuenta de que podía eliminar la última línea de código a partir de muchas de estas páginas, pasando a la página base.Era una línea que tuvo un parámetro de url y se la pasó al objeto de negocio.Bueno, ¿verdad?Bueno, no, este era mal (Yo estaba ocultar).Esta lógica pertenecía aquí, aunque era casi la misma línea en cada página.Relacionado con la interfaz de usuario de intención con el objeto de negocio.Se necesita ser explícito.De lo contrario me estaba escondiendo, no encapsulado.Con esa línea, alguien que busca en esa página gustaría saber lo que la página ¿y por qué;sin ella, sería un dolor para determinar lo que estaba pasando.

Creo que explícitamente se refiere a saber exactamente lo que está haciendo cuando lo utiliza. Esto es diferente de conocer exactamente cómo se hace, que es la parte compleja.

Es hora de expresar las intenciones. El lector no puede decir si el defecto fue dejado por error o por diseño. Al ser explícita elimina esa duda.

El código es difícil de leer que escribir. En aplicaciones no triviales, una determinada pieza de código también será leído más a menudo de lo que está escrito. Por lo tanto, debemos escribir nuestro código para que sea tan fácil en el lector como sea posible. Código que hace un montón de cosas que no es obvio que no es fácil de leer (o más bien, es difícil de entender cuando lo lea). Ergo, lo explícito es considerado una buena cosa.

Basándose en el comportamiento por defecto oculta los detalles importantes de personas que no están muy familiarizados con el lenguaje / marco / lo que sea.

Tenga en cuenta cómo el código Perl que se basa en gran medida en taquigrafías es difícil de entender para las personas que no saben Perl.

Ser vs. explícito lo implícito es todo acerca de lo que se oculta, y lo que muestran.

Lo ideal es exponer conceptos que, o bien el usuario se preocupa, o tiene que preocuparse por (si quieren o no).

La ventaja de ser explícito es que es más fácil de rastrear y averiguar lo que está pasando, sobre todo en caso de fallo. Por ejemplo, si quiero hacer el registro, puedo tener una API que requiere inicialización explícita con un directorio para el registro. O, puedo usar un valor predeterminado.

Si doy un directorio explícito, y se produce un error, lo sabrá por qué. Si utilizo una ruta implícita, y se produce un error, voy a tener ni idea de lo que ha ido mal, por qué o dónde buscar para solucionarlo.

comportamiento implícito es casi siempre el resultado de ocultación de información por parte del consumidor. A veces eso es lo que hay que hacer, por ejemplo, cuando usted sabe en su entorno sólo hay una "respuesta". Sin embargo, lo mejor es saber cuando se está ocultando información y por qué, y asegurarse de que está dejando que sus consumidores trabajan más cerca de su nivel de intención, y sin tratar de ocultar los elementos de complejidad esencial.

comportamiento frecuentes implícita es el resultado de objetos "autoconfiguración" que se ven en su entorno y tratar de adivinar el comportamiento correcto. Yo evitaría este patrón en general.

Una regla probablemente me sigo general es que, para una determinada API, cualquier operación o bien debe ser explícita o implícita, pero nunca una combinación. O bien hacer algo la operación, el usuario tiene que hacer, o que sea algo que ellos no tienen que pensar. Es cuando se mezclan los dos que usted se encontrará con los mayores problemas.

marcos, etc., pueden ser tanto explícita y ocultar la complejidad al ofrecer las abstracciones adecuadas para el trabajo por hacer.

Al ser explícita permite a otros para inspeccionar y entender lo que se quiere decir con el desarrollador original.

complejidad de ocultación no es equivalente con ser implícita. Implícito daría lugar a un código que sólo es comprensible por la persona que lo escribió como tratando de entender lo que pasa bajo el capó es similar a la ingeniería inversa en este caso.

código explícito tiene una probabilidad teórica de ser demostrado correcta. código implícito no tiene posibilidades en este sentido.

código explícito es mantenible, código implícito no es -. Esto enlaza con comentarios correctos y la elección de sus identificadores con cuidado

Un lenguaje "explícito" permite a la computadora para encontrar errores en el software que un lenguaje menos explícita no lo hace.

Por ejemplo, C ++ tiene la palabra clave const para las variables cuyos valores no deben cambiar. Si un programa intenta cambiar estas variables, el compilador puede indicar que el código es probable mal.

Buena abstracción no oculta complejidades, toma decisiones que es mejor dejar que el compilador fuera de su plato.

Considere la recolección de basura: La complejidad de la liberación de los recursos se delegan a un recolector de basura que es (probablemente) mejor calificado para tomar una decisión que usted, el programador. No sólo se necesita la decisión de sus manos, sino que hace una mejor decisión de lo que tendría usted mismo.

Explícito es (a veces) buena porque hace de modo que ciertas decisiones que en algunos casos es mejor dejar que el programador no se hacen automáticamente por un agente menos cualificados. Un buen ejemplo es cuando se está declarando un tipo de datos de coma flotante en un lenguaje de tipo C y la inicialización en un entero:

double i = 5.0;

si por el contrario se va a declarar como

var i = 5;

el compilador legítimamente suponer que desea un int y operaciones más adelante podrían truncarse.

Explícito es deseable en el contexto de lo que es claro para el lector del código de lo que se pretende hacer.

Hay muchos ejemplos, pero es todo acerca de dejar ninguna duda sobre su intención.

por ejemplo. Estos no son muy explícitos:

while (condition);

int MyFunction()

bool isActive;         // In C# we know this is initialised to 0 (false)

a = b??c;

double a = 5;

double angle = 1.57;

pero estos son:

while (condition)
    /* this loop does nothing but wait */ ;

private int MyFunction()

int isActive = false;  // Now you know I really meant this to default to false

if (b != null) a = b; else a = c;

double a = 5.0;

double angleDegrees = 1.57;

Los últimos casos no dejan lugar a interpretaciones erróneas. El primero podría conducir a errores cuando alguien no puede leer con cuidado, o no entiende claramente una sintaxis menos legible por hacer algo, o se mezcla tipos integer y float.

En algunos casos el contrario es "mágica" - como "entonces se produce un milagro" en .

Cuando el código de lectura de un desarrollador que intenta comprender o depurar lo que está pasando, lo explícito puede ser una virtud.

El propósito de los marcos de mover las cosas es eliminar la duplicación de código y permitir la edición más fácil de trozos sin romper todo el asunto. Cuando sólo tiene una manera de hacer algo, como dicen SUM (x, y); Sabemos exactamente lo que esto va a hacer, no hay razón para necesitar nunca para volver a escribir, y si es necesario se puede, pero su muy poco probable. Lo contrario de esto es lenguajes de programación como .NET que proporcionan funciones muy complejas que a menudo tendrá que volver a escribir si su hacer nada, pero el simple ejemplo obvio.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top