title: Wrappers/law of demeter seems to be an anti-pattern
body: <p>I've been reading up on this "Law of Demeter" thing, and it (and pure "wrapper" classes in general) seem to generally be anti patterns. Consider an implementation class:</p>
  
  <pre><code>class FluidSimulator {
      void reset() { /* ... */ }
  }
  </code></pre>
  
  <p>Now consider two different implementations of another class:</p>
  
  <pre><code>class ScreenSpaceEffects1 {
      private FluidSimulator _fluidDynamics;
      public FluidSimulator getFluidSimulator() { return _fluidDynamics; }
  }
  
  class ScreenSpaceEffects2 {
      private FluidSimulator _fluidDynamics;
      public void resetFluidSimulation() { _fluidDynamics.reset(); }
  }
  </code></pre>
  
  <p>And the ways to call said methods:</p>
  
  <pre><code>callingMethod() {
     effects1.getFluidSimulator().reset(); // Version 1
     effects2.resetFluidSimulation();      // Version 2
  }
  </code></pre>
  
  <p>At first blush, version 2 seems a bit simpler, and follows the "rule of Demeter", hide Foo's implementation, etc, etc. But this ties any changes in FluidSimulator to ScreenSpaceEffects. For example, if a parameter is added to reset, then we have:</p>
  
  <pre><code>class FluidSimulator {
      void reset(bool recreateRenderTargets) { /* ... */ }
  }
  
  class ScreenSpaceEffects1 {
      private FluidSimulator _fluidDynamics;
      public FluidSimulator getFluidSimulator() { return _fluidDynamics; }
  }
  
  class ScreenSpaceEffects2 {
      private FluidSimulator _fluidDynamics;
      public void resetFluidSimulation(bool recreateRenderTargets) { _fluidDynamics.reset(recreateRenderTargets); }
  }
  
  callingMethod() {
     effects1.getFluidSimulator().reset(false); // Version 1
     effects2.resetFluidSimulation(false);      // Version 2
  }
  </code></pre>
  
  <p>In both versions, callingMethod needs to be changed, but in Version 2, ScreenSpaceEffects <em>also</em> needs to be changed. Can someone explain the advantage of having a wrapper/facade (with the exception of adapters or wrapping an external API or exposing an internal one).</p>
  
  <p><strong>EDIT:</strong> One of many real examples for which I ran into this rather than a trivial example.</p>