¿Debo exponer un valor "calculado" como una propiedad o un método?

13

Tengo una clase C # que representa un tipo de contenido en un sistema de gestión de contenido web.

Tenemos un campo que permite que un editor de contenido web ingrese una plantilla HTML para mostrar el objeto. Básicamente utiliza la sintaxis del manillar para sustituir los valores de las propiedades del objeto en la cadena HTML:

<h1>{{Title}}</h1><p>{{Message}}</p>

Desde una perspectiva de diseño de clase, ¿debo exponer la cadena HTML formateada (con sustitución) como una propiedad o método ?

Ejemplo como propiedad:

public class Example
{
  private string _template;
  public string Title { get; set; }
  public string Message { get; set; }
  public string Html 
  {
    get
    {
      return this.ToHtml();
    }
    protected set { }
  }

  public Example(Content content)
  {
    this.Title = content.GetValue("title") as string;
    this.Message = content.GetValue("message") as string;
    _template = content.GetValue("template") as string;
  }

  private string ToHtml()
  {
    // Perform substitution and return formatted string.
  }  
}

Ejemplo como método:

public class Example
{
  private string _template;
  public string Title { get; set; }
  public string Message { get; set; }

  public Example(Content content)
  {
    this.Title = content.GetValue("title") as string;
    this.Message = content.GetValue("message") as string;
    _template = content.GetValue("template") as string;
  }

  public string ToHtml()
  {
    // Perform substitution and return formatted string.
  }  
}

No estoy seguro desde el punto de vista del diseño, ¿hace alguna diferencia o hay razones por las cuales un enfoque es mejor que el otro?

Charles Wesley
fuente
La ventaja de las propiedades es que están serializadas en XML o JSOn, pero eso es todo, creo.
Knerd
1
Las propiedades deben representar la información del estado. No importa si se calculan o no. Hace que sea más fácil usarlos en expresiones. Solo usted sabe si HTML representa un estado del objeto.
Reactgular

Respuestas:

18

ACTUALIZACIÓN: Esta pregunta fue el tema de mi blog en mayo de 2014 . Gracias por la gran pregunta!


Para agregar a la respuesta de Robert Harvey : una propiedad debe ser:

  • lógicamente, una propiedad de la clase, la forma en que dice su color o año o modelo son las propiedades de un automóvil.

  • no más de, digamos, diez veces más lento de calcular que obtener de un campo.

  • algo que no le importa que se calcule mientras se depura. El depurador VS calcula automáticamente las propiedades.

  • incapaz de fallar. Los captadores siempre deben devolver un valor sin importar el estado del objeto.

No creo que su Htmlpropiedad propuesta llegue a ninguno de esos. No lo conviertas en una propiedad a menos que los golpee a todos .

Eric Lippert
fuente
"no puede fallar. Los captadores siempre deben devolver un valor sin importar el estado del objeto". ¿No deberían las propiedades lanzar una excepción después de que su objeto haya sido eliminado?
Stephen
6

ToHtmles correctamente un método, como lo ha escrito en ambos casos. Solo exponerlo públicamente.

Knerd hace un buen punto: las propiedades pueden ser serializadas. Nunca deserializaría del HTML, por lo que no tiene mucho sentido convertirlo en una propiedad desde esa perspectiva.

De acuerdo con la forma en que funcionan los ORM y los objetos de repositorio: los campos en un registro o tupla se representan con propiedades, pero usted recupera el registro (o alguna forma de él) usando un método.

Robert Harvey
fuente