[#RESHARPER] Tip: Introduce Variable (an internal #refactoring good good)


Buenas,

he other day was the Victor and I was surprised that he did not know the “Enter Variable” feature of ReSharper .Mainly, because the Victor is a fan of shortcuts keyboards, you want to or not, they increase productivity a lot.

Note: you to be fast with the keyboard, does not mean that you’re a good programmer. The writer is an example of this.

Returning to Introduce Variable, the purpose of this functionality is to create an “internal” refactoring within a method or function. Thinking of the most popular cases of refactoring, this is like an Extract Method, but internal. Here is an example, step by step. Suppose we have the following code:

   1: using System;
   2:  
   3: namespace ClassLibrary2
   4: {
   5:     public class Class1
   6:     {
   7:         public Class1()
   8:         {
   9:             string someValue = Guid.NewGuid().ToString() + " - valentino - " + Guid.NewGuid().ToString();
  10:         }
  11:     }
  12: }

and line 9 is a little confusing to us. If we want to implement the sum of the first 2 parts in another variable we can do the following.

1. Select the parts to work

image

2. Press CTRL + r, CTRL + v, or Enter a Variable option.

image

3 We will have this part of our code in another internal variable to the field where we are working. Where can we also define the data type, name, etc. Just great!

image

 

Saludos @ La Finca

El Bruno

image image image

[#RESHARPER] Tip: Introduce Variable (un #refactoring interno de los buenos buenos)


Buenas,

el otro día estaba con el Víctor y me sorprendió que no conociese la feature “Introduce Variable” de ReSharper. Principalmente, porque el Víctor es un fanático de los atajos de teclados, que quieras o no, incrementan la productividad muchísimo.

Nota: que seas rápido con el teclado, no significa que seas un buen programador. El que escribe es un ejemplo de ello.

Volviendo al Introduce Variable, el objetivo de esta funcionalidad es crear un refactoring “interno” dentro de un método o función. Pensando en los casos más populares de refactoring, esto es como un Extract Method, pero interno. Veamos un ejemplo, paso a paso. Supongamos que tenemos el siguiente código:

   1: using System;

   2:  

   3: namespace ClassLibrary2

   4: {

   5:     public class Class1

   6:     {

   7:         public Class1()

   8:         {

   9:             string someValue = Guid.NewGuid().ToString() + " - valentino - " + Guid.NewGuid().ToString();

  10:         }

  11:     }

  12: }

y la línea 9 nos resulta un poco confusa. Si queremos implementar la suma de las 2 primeras partes en otra variable podemos hacer lo siguiente.

1. Seleccionar las partes a trabajar

image

2. Presionar CTRL+R, CTRL+V, o la opción Introduce Variable.

image

3. Tendremos esta parte de nuestro código en otra variable interna al ámbito donde estamos trabajando. Donde además podremos definir el tipo de dato, el nombre, etc. Simplemente genial !!!

image

 

 

Saludos @ Home

El Bruno

image image image

[#RESHARPER] EAP 8.0, disabling the warnings of a single line!


image

Buenas,

Team of JetBrains are a few cracks, of that there is no doubt. Each new version of ReSharper brings features that are really useful and also generally up to the nail trends product where to pull level.(This is a way of looking at it, otherwise it is they set the trends, issue of opinions).

What was going, I was reviewing the features of the new ReSharper 8.0 (EAP is open!) and I find things really powerful as the Go To Everything which is a kind of ULTIMATE SEARCH AND NAVIGATE to any element of your solution, or the Assembly Explorer that was previously part ofdotPeek , the free decompiler for JetBrains , and that it is now also part of R #.

However, the best and the best of far is what we can do with the following lines within a code file

   1: // ReSharper disable all

From this line, ReSharper it ignored all the warnings until you find

   1: // ReSharper restore all 

A very simple functionality, but that is extremely useful in many cases!

Source: http://blogs.jetbrains.com/dotnet/2013/03/introducing-the-resharper-8-eap/

Saludos @ Home

El Bruno

image image image

[#RESHARPER] EAP 8.0, deshabilitando los warnings de un solo saque !!!


image

Buenas.

El equipo de JetBrains son unos cracks, de eso no hay duda. Cada nueva versión de ReSharper trae features que son realmente útiles y además suelen dar en el clavo con las tendencias a nivel producto para donde tirar. (Esto es una forma de verlo, otra forma es que ellos marcan la tendencia, cuestión de opiniones).

A lo que iba, estaba repasando las features del nuevo ReSharper 8.0 (EAP is open!!!) y me encuentro con cosas realmente potentes como el Go To Everything que es una especie ULTIMATE SEARCH AND NAVIGATE hacia cualquier elemento de tu solución, o el Assembly Explorer que antes era parte de dotPeek, el decompilador gratuito de JetBrains, y que ahora es parte también de R#.

Sin embargo, lo mejor y lo mejor de lejos es lo que podremos hacer con las siguientes líneas dentro de un archivo de código

   1: // ReSharper disable all

A partir de esa línea, ReSharper ignorará todos los warnings hasta que encuentre

   1: // ReSharper restore all 

Una funcionalidad muy simple, pero que es extremadamente útil en muchos casos !!!

 

Source: http://blogs.jetbrains.com/dotnet/2013/03/introducing-the-resharper-8-eap/

Saludos @ Home

El Bruno

image image image

[#VS2012] Sobre el error raro de #LightSwitch for HTML Client Preview 2 y #ReSharper


image

Buenas,

hace unos días se liberó LightSwitch for HTML Client Preview 2 (el blog oficial aquí y el post aquí), como justo andaba necesitado de algo similar decidí probarlo. Antes del golpazo que me pegué pongo un poco de contexto, LightSwitch está bien. No muy bien, pero bien. En poco tiempo se pueden crear aplicaciones Data Driven que nos sacan de un apuro. Además la publicación en Azure es muy natural y claro, si tienes todo el paquete completo, puedes crear algo en modo demo o mantenimiento en pocos pasos.

Nota: Si piensas que LightSwitch solucionará todos tus problemas, pues estás frito, en una APLICACION REAL, no la típica demo o aplicación de usar y tirar, lo que creas en 15 minutos con LightSwitch no es suficiente, tienes que DEDICARLE MAS TIEMPO Y UN POCO DE SESERA. Ahí quedas advertido.

Como iba diciendo, la Client Preview 1 estaba solo disponible para probar en una máquina virtual, esta versión es más amigable y la podemos instalar como una extensión de Visual Studio 2012. Yo me fui a descargar la versión desde el link oficial y decidí probarla.

Sin embargo al momento de crear mi primer proyecto de prueba, me encontré con el siguiente error:

—————————
Microsoft Visual Studio
—————————
Cannot load the application item provider:\nSequence contains no elements\nThis may indicate the model file is corrupted.
—————————
OK  
—————————

image

Y listo!!! Visual Studio 2012 quedaba más frito que un huevo en pascua. Yo no soy de los que suelen pensar maquinaciones raras cuando algo no funciona, sin embargo esta vez todo me apuntaba a un plan maléfico para reventar una semana que viene siendo eterna … así que me armé de paciencia, comencé a buscar respuestas en internet y nada >> llegó el momento de depurar el IDE.

Nota 2: En mi caso cualquier excusa es buena para hacer un DUMP del IDE de Visual Studio 2012 y depurar cosillas a un nivel debajo de lo normal. No creo que mi búsqueda en BING haya tardado más de 2 segundos, porque he buscado de nuevo y he encontrado mi error reportado y solucionado.

Después de atacharme al IDE y de ver un poco las trazas del mismo, me di cuenta de que el problema estaba en que no hay amistad entre LightSwitch y ReSharper. Así que la solución más recomendable fue desactivar ReSharper desde el menú “Tool // Options” luego seleccionamos ReSharper y lo pausamos.

image

A partir de este momento LightSwitch comenzó a funcionar de perlas y pude seguir probando este new toy.

Descarga: http://go.microsoft.com/fwlink/?LinkID=255924

Forum: http://social.msdn.microsoft.com/Forums/en-US/lightswitchhtml/thread/5c7f5652-4712-4db7-8cd3-e9df4858d4a5

Saludos @ Home

El Bruno

image image image

[#RESHARPER] ReSharper 7.1 EAP ya esta abierto para todos


Buenas,

desde ayer ya podemos descargar la versión para prueba de ReSharper 7.1. Como todas las versiones no finales, pues estamos jugando con fuego. Sin embargo hay 2 o 3 features interesantes en esta versión:

  • No more regions después de un Code CleanUp
  • Hay un par de cosillas nuevas que afectan a ASP.Net MVC. Tengo que darle un vistazo a este listado para ver que han arreglado e incorporado.
  • Si sos un fan de .Net Framework 4.5, pues ya tenemos soporte para CallerInfo en las propiedades.
  • Etc ….

El listado completo en el siguiente link.

Fuente: http://blogs.jetbrains.com/dotnet/2012/09/resharper-71-early-access-is-open/

Descarga: http://confluence.jetbrains.net/display/ReSharper/ReSharper+7.1+Nightly+Builds

Saludos @ Home

El Bruno

image image image

[# RESHARPER] AgentMulder: excellent AddIn to work with IoC


Buenas,

yesterday I commented on the availability of Unity for .net 4.5 and also made a comment on Agent Mulder . Agent Mulder is an awesome extension for ReSharper that allows you to navigate to a specific type declarations and implementations when we are working with some dependency injection container.

How to explain it in words I’m not well today, better go to an example. Suppose that we are working with Unity and have a with the following example console application:

   1: using System;
   2: using System.Diagnostics;
   3: using Microsoft.Practices.Unity;
   4:  
   5: namespace ConsoleApplication1
   6: {
   7:     class Program
   8:     {
   9:         static void Main(string[] args)
  10:         {
  11:             var container = new UnityContainer();
  12:             container.RegisterType<ILogger, LogDebug>();
  13:             var log = container.Resolve<ILogger>();
  14:             log.Log("sample data");
  15:             Console.ReadLine();
  16:         }
  17:     }
  18:     internal interface ILogger
  19:     {
  20:         void Log(string data);
  21:     }
  22:     class LogTrace: ILogger
  23:     {
  24:         public void Log(string data)
  25:         {
  26:             Trace.WriteLine(data);
  27:         }
  28:     }
  29:     class LogDebug : ILogger
  30:     {
  31:         public void Log(string data)
  32:         {
  33:             Debug.WriteLine(data);
  34:         }
  35:     }
  36: }

In the Visual Studio IDE, trying to see where the LogDebug class has been used is a bit craftsmanship, having no direct references, because it is a little complicated to know where you are using. If we see the help online that we since we will see something similar to the following in the code editor

image

Now if you download and install Agent Mulder , this plugin from ReSharper will show us that the class LogDebug() is registering and using with Unity. We can access registration of the same line and even then accessing dynamic references of ReSharper to see where it is implemented and use the Log() function.

image

In a few words Agent Mulder helps us to navigate between the references that we do with a dependency injector, as Unity, CastleWindsor, etc. The official website of the product sample is mounted on CastleWindsor .

Download: http://hmemcpy.github.com/AgentMulder/

Saludos @ La Finca

El Bruno

image image image

[#RESHARPER] AgentMulder: excelente AddIn para trabajar con IoC


Buenas,

ayer comenté sobre la disponibilidad de Unity para .Net 4.5 y además hice un comenario sobre Agent Mulder. Agent Mulder es una extensión impresionante para ReSharper que nos permite navegar hacia las implementaciones y declaraciones de un tipo específico cuando estamos trabajando con algún contenedor de inyección de dependencias.

Como explicarlo en palabras no se me da bien hoy, mejor vamos a un ejemplo. Supongamos que estamos trabajando con Unity y tenemos una aplicación de consola con el siguiente ejemplo:

 

   1: using System;

   2: using System.Diagnostics;

   3: using Microsoft.Practices.Unity;

   4:  

   5: namespace ConsoleApplication1

   6: {

   7:     class Program

   8:     {

   9:         static void Main(string[] args)

  10:         {

  11:             var container = new UnityContainer();

  12:             container.RegisterType<ILogger, LogDebug>();

  13:             var log = container.Resolve<ILogger>();

  14:             log.Log("sample data");

  15:             Console.ReadLine();

  16:         }

  17:     }

  18:     internal interface ILogger

  19:     {

  20:         void Log(string data);

  21:     }

  22:     class LogTrace: ILogger

  23:     {

  24:         public void Log(string data)

  25:         {

  26:             Trace.WriteLine(data);

  27:         }

  28:     }

  29:     class LogDebug : ILogger

  30:     {

  31:         public void Log(string data)

  32:         {

  33:             Debug.WriteLine(data);

  34:         }

  35:     }

  36: }

En el IDE de Visual Studio, intentar ver donde se ha utilizado la clase LogDebug es un poco trabajo artesanal, ya que al no tener referencias directas, pues se complica un poco saber donde se está utilizando. Si vemos la ayuda online que tenemos en el editor de código pues veremos algo similar a lo siguiente

image

Ahora bien, si descargamos e instalamos Agent Mulder, este plugin de ReSharper nos mostrará que la clase LogDebug() se está registrando y utilizando con Unity. Podremos acceder a la línea de registro de la misma y luego inclusive, acceder a las referencias dinámicas de ReSharper para ver donde se implementa y utiliza la funcion Log().

image

En pocas palabras, Agent Mulder nos ayuda a navegar entre las referencias que realizamos con algún inyector de dependencias, como Unity, CastleWindsor, etc. El ejemplo de la página oficial del producto está montado sobre CastleWindsor.

Descarga: http://hmemcpy.github.com/AgentMulder/

Saludos @ La Finca

El Bruno

image image image

[#RESHARPER] Cool Feature: Extract Class


Buenas,

a few days ago there was a webcast where friends of JetBrains commented on the news ofReSharper 7. 55 Minutes quite interesting, and among the things that showed today I remembered one that came to the hair. A case of refactoring where you are with a class that has too much content and responsibilities and touches you, begin to separate parties.

In one example a bit like the one shown to the webcast, and quite more similar to what it was changed recently, we assume a class that only see it makes us bad eyes.

   1: namespace ElBruno.Refactoring
   2: {
   3:     public class ComplexClass
   4:     {
   5:         public int SimpleProperty1 { get; set; }
   6:         public int SimpleProperty2 { get; set; }
   7:         public void SimpleStuff1()
   8:         {
   9:             SimpleProperty2 = 2;
  10:         }
  11:         public int SimpleStuff2()
  12:         {
  13:             return SimpleProperty1 + SimpleProperty2;
  14:         }
  15:         public int ComplexProperty1 { get; set; }
  16:         public int ComplexProperty2 { get; set; }
  17:         public void ComplexStuff1()
  18:         {
  19:             ComplexProperty2 = 2;
  20:         }
  21:         public int ComplexStuff2()
  22:         {
  23:             return ComplexProperty1 + ComplexProperty2;
  24:         }
  25:  
  26:     }
  27: }

Tip: this is popularly called Code Smell . Give him a return to the definition because it is more popular than think. If you’ve never felt that feeling or live enclosed in a bubble and do not know that you do read this blog or your level of empathy is at the height of Frodo.

As well, at a glance we see that we have mixed the responsibilities of Complex and Simple in the same class, so he plays “separate them”. On the class pressed CTRL + SHIT + R and deploy the refactoring menu.

image

Select the option “Extract Class” and we can see a form to define elements of the complex class want to pass to another class, in this case to a so-called SimpleClass. When are going to select items that we want to move up, we see that also shows the dependencies between them and suggests that we should also move to the new class.

image

Once finished the refactoring, you can find 2 classes quite clean and the code already smells a little better.

Disclaimer: I have put everything in a single file to be able to show the example, do not kill me.

   1: namespace ElBruno.Refactoring
   2: {
   3:     public class SimpleClass
   4:     {
   5:         public int SimpleProperty1 { get; set; }
   6:         public int SimpleProperty2 { get; set; }
   7:  
   8:         public void SimpleStuff1()
   9:         {
  10:             SimpleProperty2 = 2;
  11:         }
  12:  
  13:         public int SimpleStuff2()
  14:         {
  15:             return SimpleProperty1 + SimpleProperty2;
  16:         }
  17:     }
  18:  
  19:     public class ComplexClass
  20:     {
  21:         private readonly SimpleClass _simpleClass = new SimpleClass();
  22:  
  23:         public int ComplexProperty1 { get; set; }
  24:         public int ComplexProperty2 { get; set; }
  25:         public void ComplexStuff1()
  26:         {
  27:             ComplexProperty2 = 2;
  28:         }
  29:         public int ComplexStuff2()
  30:         {
  31:             return ComplexProperty1 + ComplexProperty2;
  32:         }
  33:  
  34:     }
  35: }

But… Everything is not always as simple

Now, the previous example we like very much, but real not all in life is as simple. Those people who don’t think about their physical well-being generally do grow much classes, but also generate relationships and dependencies between items of the same class to cut off fingers thinking tends to be the first thing you think of when you see something like (also remember their mothers, parents and in very extreme cases get to remember his grandmother.) The latter case recommend you pull the code and do it again from zero).

   1: namespace ElBruno.Refactoring
   2: {
   3:     public class ComplexClass
   4:     {
   5:         public int SimpleProperty1 { get; set; }
   6:         public int SimpleProperty2 { get; set; }
   7:         public void SimpleStuff1()
   8:         {
   9:             SimpleProperty2 = 2;
  10:         }
  11:         public int SimpleStuff2()
  12:         {
  13:             return SimpleProperty1 + SimpleProperty2 + ComplexProperty1;
  14:         }
  15:         public int ComplexProperty1 { get; set; }
  16:         public int ComplexProperty2 { get; set; }
  17:         public void ComplexStuff1()
  18:         {
  19:             ComplexProperty2 = 2;
  20:         }
  21:         public int ComplexStuff2()
  22:         {
  23:             return ComplexProperty1 + ComplexProperty2 + SimpleProperty1;
  24:         }
  25:     }
  26: }

In the previous case, from the SimpleStuff2 function () is using protocol properties of Complex and something similar from the function ComplexStuff2 (). what solució gives us ? ReSharper for these cases? What it does, is create a private of the related tipo field and with the same, these dependencies are resolved. For example:

   1: namespace ElBruno.Refactoring
   2: {
   3:     public class SimpleClass
   4:     {
   5:         private ComplexClass _complexClass;
   6:  
   7:         public SimpleClass(ComplexClass complexClass)
   8:         {
   9:             _complexClass = complexClass;
  10:         }
  11:  
  12:         public int SimpleProperty1 { get; set; }
  13:         public int SimpleProperty2 { get; set; }
  14:  
  15:         public void SimpleStuff1()
  16:         {
  17:             SimpleProperty2 = 2;
  18:         }
  19:  
  20:         public int SimpleStuff2()
  21:         {
  22:             return SimpleProperty1 + SimpleProperty2 + _complexClass.ComplexProperty1;
  23:         }
  24:     }
  25:  
  26:     public class ComplexClass
  27:     {
  28:         private readonly SimpleClass _simpleClass;
  29:  
  30:         public ComplexClass()
  31:         {
  32:             _simpleClass = new SimpleClass(this);
  33:         }
  34:  
  35:         public int ComplexProperty1 { get; set; }
  36:         public int ComplexProperty2 { get; set; }
  37:         public void ComplexStuff1()
  38:         {
  39:             ComplexProperty2 = 2;
  40:         }
  41:         public int ComplexStuff2()
  42:         {
  43:             return ComplexProperty1 + ComplexProperty2 + _simpleClass.SimpleProperty1;
  44:         }
  45:     }
  46: }

It is likely that in a case like this, you have to separate the responsibilities of the classes in a 3rd level. ReSharper already has given us a great help now touch pass to another tool we use little and is known as the “brains” or the mind… Open-mouthed smile

Saludos @ Home

El Bruno

image image image

[#RESHARPER] Novedad y de las buenas: Extract Class


Buenas,

hace unos días hubo un webcast donde los amigos de JetBrains comentaron las novedades de ReSharper 7. Son 55 minutos bastante interesantes, y entre las cosas que mostraron hoy me acordé de una que me vino al pelo. Un caso de refactoring donde te encuentras con una clase que tiene demasiado contenido y responsabilidades y te toca, empezar a separar por partes.

En un ejemplo un poco parecido al que se muestra al webcast, y bastante más parecido a lo que estuve modificando recien, partimos de una clase que de solo verla nos hace mal a los ojos.

   1: namespace ElBruno.Refactoring

   2: {

   3:     public class ComplexClass

   4:     {

   5:         public int SimpleProperty1 { get; set; }

   6:         public int SimpleProperty2 { get; set; }

   7:         public void SimpleStuff1()

   8:         {

   9:             SimpleProperty2 = 2;

  10:         }

  11:         public int SimpleStuff2()

  12:         {

  13:             return SimpleProperty1 + SimpleProperty2;

  14:         }

  15:         public int ComplexProperty1 { get; set; }

  16:         public int ComplexProperty2 { get; set; }

  17:         public void ComplexStuff1()

  18:         {

  19:             ComplexProperty2 = 2;

  20:         }

  21:         public int ComplexStuff2()

  22:         {

  23:             return ComplexProperty1 + ComplexProperty2;

  24:         }

  25:  

  26:     }

  27: }

Tip: Esto popularmente se denomina Code Smell. Dale una vuelta a la definición porque es más popular de lo que crees. Si nunca has sentido esa sensación o bien vives encerrado en una burbuja y no sé que haces leyendo este blog o tu nivel de empatia está a la altura de Frodo.

Pues bien, a simple vista vemos que tenemos mezcladas las responsabilidades de Complex y Simple en la misma clase, asi que toca “separarlas”. Sobre la clase presionamos CTRL + SHIT + R y desplegamos el menú de refactoring.

image

Seleccionamos la opción “Extract Class” y podremos ver un formulario para definir que elementos de la clase compleja queremos pasar a otra clase, en este caso a una llamada SimpleClass. Cuando vamos seleccionando los elementos que queremos mover, vemos que además nos muestra las dependencias entre ellos y nos sugiere los que también deberíamos mover a la nueva clase.

image

Una vez terminado el refactoring, nos podemos encontrar con 2 clases bastantes limpias y el código ya huele un poco mejor.

Disclaimer: he puesto todo en un único archivo para poder mostrar el ejemplo, no me maten.

   1: namespace ElBruno.Refactoring

   2: {

   3:     public class SimpleClass

   4:     {

   5:         public int SimpleProperty1 { get; set; }

   6:         public int SimpleProperty2 { get; set; }

   7:  

   8:         public void SimpleStuff1()

   9:         {

  10:             SimpleProperty2 = 2;

  11:         }

  12:  

  13:         public int SimpleStuff2()

  14:         {

  15:             return SimpleProperty1 + SimpleProperty2;

  16:         }

  17:     }

  18:  

  19:     public class ComplexClass

  20:     {

  21:         private readonly SimpleClass _simpleClass = new SimpleClass();

  22:  

  23:         public int ComplexProperty1 { get; set; }

  24:         public int ComplexProperty2 { get; set; }

  25:         public void ComplexStuff1()

  26:         {

  27:             ComplexProperty2 = 2;

  28:         }

  29:         public int ComplexStuff2()

  30:         {

  31:             return ComplexProperty1 + ComplexProperty2;

  32:         }

  33:  

  34:     }

  35: }

Pero … No siempre todo es tan simple

Ahora bien, el ejemplo anterior nos gusta y mucho, pero en la vida real no todo es tan simple. Aquellas personas que no piensan en su bienestar físico por lo general hacen crecer mucho las clases, pero además generan relaciones y dependencias entre los elementos de la misma clase de manera que pensar en cortarles los dedos suele ser lo primero que se te ocurre cuando ves algo así (También te acuerdas de sus madres, de sus padres y en casos muy extremos llegas a acordarte de su abuela. Para este último caso recomiendo tirar el código y hacerlo de nuevo desde cero).

   1: namespace ElBruno.Refactoring

   2: {

   3:     public class ComplexClass

   4:     {

   5:         public int SimpleProperty1 { get; set; }

   6:         public int SimpleProperty2 { get; set; }

   7:         public void SimpleStuff1()

   8:         {

   9:             SimpleProperty2 = 2;

  10:         }

  11:         public int SimpleStuff2()

  12:         {

  13:             return SimpleProperty1 + SimpleProperty2 + ComplexProperty1;

  14:         }

  15:         public int ComplexProperty1 { get; set; }

  16:         public int ComplexProperty2 { get; set; }

  17:         public void ComplexStuff1()

  18:         {

  19:             ComplexProperty2 = 2;

  20:         }

  21:         public int ComplexStuff2()

  22:         {

  23:             return ComplexProperty1 + ComplexProperty2 + SimpleProperty1;

  24:         }

  25:     }

  26: }

En el caso anterior, desde la función SimpleStuff2() se utilizand propiedades de Complex y algo parecido desde la función ComplexStuff2(). ¿Qué solució nos da ReSharper para estos casos? Pues lo que hace, es crear un field privado del tipo relacionado y con el mismo, se solucionan estas dependencias. Por ejemplo:

   1: namespace ElBruno.Refactoring

   2: {

   3:     public class SimpleClass

   4:     {

   5:         private ComplexClass _complexClass;

   6:  

   7:         public SimpleClass(ComplexClass complexClass)

   8:         {

   9:             _complexClass = complexClass;

  10:         }

  11:  

  12:         public int SimpleProperty1 { get; set; }

  13:         public int SimpleProperty2 { get; set; }

  14:  

  15:         public void SimpleStuff1()

  16:         {

  17:             SimpleProperty2 = 2;

  18:         }

  19:  

  20:         public int SimpleStuff2()

  21:         {

  22:             return SimpleProperty1 + SimpleProperty2 + _complexClass.ComplexProperty1;

  23:         }

  24:     }

  25:  

  26:     public class ComplexClass

  27:     {

  28:         private readonly SimpleClass _simpleClass;

  29:  

  30:         public ComplexClass()

  31:         {

  32:             _simpleClass = new SimpleClass(this);

  33:         }

  34:  

  35:         public int ComplexProperty1 { get; set; }

  36:         public int ComplexProperty2 { get; set; }

  37:         public void ComplexStuff1()

  38:         {

  39:             ComplexProperty2 = 2;

  40:         }

  41:         public int ComplexStuff2()

  42:         {

  43:             return ComplexProperty1 + ComplexProperty2 + _simpleClass.SimpleProperty1;

  44:         }

  45:     }

  46: }

Lo más probable es que en un caso como esto, haya que separar en un 3er nivel las responsabilidades de las clases. ReSharper ya nos ha dado una gran ayuda ahora toca pasar a otra herramienta que usamos poco y que se conoce como la “sesera” o la mente … Open-mouthed smile

Saludos @ La Finca

El Bruno

image image image