9.5. Reducir el desorden

En un libro como éste, la simplicidad y brevedad de poner definiciones inline dentro de las clases es muy útil porque permite meter más en una página o pantalla (en un seminario). Sin embargo, Dan Saks [68] ha apuntado que en un proyecto real esto tiene como consecuencia desordenar innecesariamente la interfaz de la clase y eso hace que la clase sea más incómoda de usar. Él se refiere a los métodos definidos dentro de las clases usando la expresión latina in situ (en el lugar) y sostiene que todas las definiciones deberían colocarse fuera de la clase para mantener la interfaz limpia. La optimización, argumenta él, es un asunto distinto. Si se requiere optimizar, use la palabra reservada inline. Siguiendo ese enfoque, el ejemplo anterior Rectangle.cpp quedaría:

//: C09:Noinsitu.cpp
// Removing in situ functions

class Rectangle {
  int width, height;
public:
  Rectangle(int w = 0, int h = 0);
  int getWidth() const;
  void setWidth(int w);
  int getHeight() const;
  void setHeight(int h);
};

inline Rectangle::Rectangle(int w, int h)
  : width(w), height(h) {}

inline int Rectangle::getWidth() const {
  return width;
}

inline void Rectangle::setWidth(int w) {
  width = w;
}

inline int Rectangle::getHeight() const {
  return height;
}

inline void Rectangle::setHeight(int h) {
  height = h;
}

int main() {
  Rectangle r(19, 47);
  // Transpose width & height:
  int iHeight = r.getHeight();
  r.setHeight(r.getWidth());
  r.setWidth(iHeight);
} ///:~

Listado 9.15. C09/Noinsitu.cpp


Ahora si quiere comparar el efecto de las funciones inline con la versión convencional, simplemente borre la palabra inline. (No obstante, las funciones inline normalmente deberían aparecer en los ficheros de cabecera, mientras que las funciones no-inline deben residir en su propia unidad de traducción). Si quiere poner las funciones en la documentación, es tan simple como un «copiar y pegar». Las funciones in situ requieren más trabajo y tienen más posibilidades de provocar errores. Otro argumento a favor de este enfoque es que siempre puede producir un estilo de formato coherente para las definiciones de función, algo que no siempre ocurre con las funciones in situ.



[68] Co-autor junto a Tom Plum de C++ Programming Guidelines, Plum Hall, 1991.