I would say that just because code has been written and tested does
not make it a good design.

In C++ I can do the following ...

public class Triangle { }
public class Square { }
public class Shape : Triangle, Square { }

it will compile, I will be able to test it, but it really is not good
design

In C# I can do this ....

// in assembly A
namespace A {
public class ClassA {
  private ClassB _classB;
  public ClassA(ClassB b) { _classB = b; }
}

// in assembly B
namespace B {
public class ClassB {
  private ClassC _classC;
  public ClassA(ClassC c) { _classC = c; }
}

// in assembly C
namespace C {
public class ClassC {
  private ClassA _classA;
  public ClassA(ClassA a) { _classA = a; }
}

This does not necessarilymake a good design.

On Apr 14, 8:52 pm, BaRuSa <[email protected]> wrote:
> >> public class MyImpl : AbstractExample
> >> {
> >>    public MyImpl(string s) : base(s) { }
> >>    public MyImpl(IExampleInterface iei) : base(iei) { }
> >>}
>
> The MyImpl class works perfectly fine in the .NET framework because at
> compile time 's' is a string and 'iei' is an IExampleInterface
> regardless of what data they hold (or don't hold).  Thus the following
> overly simple code compiles and runs.
>
> MyImpl first = new MyImpl("TEST");
> MyImpl second = new MyImpl(first);
>
> Correct,
>
> var instance = MyImpl(null);
>
> is a compile time error.  This is a completely acceptable result for
> so many reasons I won't even count them.
>
> // The birth of a string some where in code
> string externalString = GetStringFromExternalSource();
> // Do Stuff
> var instance = MyImpl(externalString);
>
> The developer of AbstractExample has no control of
> GetStringFromExternalSource or what happens to externalString before
> it enters AbstractExample.  If externalString is null, there is no
> compile time error because the compiler knows which constructor to
> call.  Neither the compile time nor run time knows that having
> externalString as null is bad.  Only the implementer of
> AbstractExample knows that receiving null is bad.  Thus it is the
> obligation of the AbstractExample developer to inform the user of
> AbstractExample that null is bad, which is frequently done through the
> use of an exception.
>
> >> My advice would be to think more carefully about what it is that yor
> >> object is suppoed to be doing.
>
> This is what the objects are supposed to be doing.
>
> A.)  Have a common interface to support polymorphic features.  (using
> interface)
>
> B.)  Have a base class to support shared functionality that interact
> with immutable fields.  (using abstract class)
>
> C.)  Have different class types that have different data types. (this
> part is working)
>
> D.)  Set immutable data in the base class at the time of
> construction.  (The data happens to be a reference object that accepts
> null.)
>
> E.)  Copy immutable data in the base class from another similar object
> at the time of construction.  (That object also happens to be a
> reference object that accepts null.)
>
> That code has been written.  Everthing works and is tested except we
> haven't found a good way to test D. and E. receiving null.
>
> On Apr 14, 11:38 am, bill richards <[email protected]>
> wrote:
>
>
>
> > My answer to this is that you have a flawed design in AbstractExample.
>
> > Firstly, if you had developed this in a TDD fashion, you would not end
> > up with an object that takes two types as alternate constructors.
>
> > My advice would be to think more carefully about what it is that yor
> > object is suppoed to be doing. Quite frankly, even the .net framework
> > would be confused
>
> > public class MyImpl : AbstractExample
> > {
> >     public MyImpl(string s) : base(s) { }
> >     public MyImpl(IExampleInterface iei) : base(iei) { }
>
> > }
>
> > var instance = MyImpl(null);   ... what constructor should be invoked?
>
> > On Apr 14, 3:34 pm, BaRuSa <[email protected]> wrote:
>
> > > Simplified example of a class:
>
> > > abstract class AbstractExample : IExampleInterface
> > > {
> > >   protected AbstractExample(string name) { /* Do Stuff */ }
> > >   protected AbstractExample(IExampleInterface deepCopy) { /* Do Stuff
> > > */ }
> > >   // abstract methods
>
> > > }
>
> > > Simpiflied test for constructor:
>
> > > [ExpectedException(typeof(ArgumentNullException))]
> > > void Test()
> > > {
> > >   AbstractExample example;
> > >   string name;
>
> > >   name = null;
> > >   example = MockRepository.GenerateStrictMock<AbstractExample>(name);
>
> > > }
>
> > > The test creates an exception
> > > "System.Reflection.AmbiguousMatchException: Ambiguous match found."  I
> > > am assuming the problem is there are two constructors that could
> > > accept null, but Rhino Mocks doesn't know which type to use.  I know
> > > there are constraints that be placed on methods; are there constraints
> > > for calling constructors?  Is there a different solution I am not
> > > thinking about?- Hide quoted text -
>
> > - Show quoted text -- Hide quoted text -
>
> - Show quoted text -

-- 
You received this message because you are subscribed to the Google Groups 
"Rhino.Mocks" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/rhinomocks?hl=en.

Reply via email to