Search code examples
ooptestingsolid-principles

OO design: Copying data from class A to B


Having the SOLID principles and testability in mind, consider the following case:

You have class A and class B which have some overlapping properties. You want a method that copies and/or converts the common properties from class A to class B. Where does that method go?

  1. Class A as a B GetAsB() ?
  2. Class B as a constructor B(A input)?
  3. Class B as a method void FillWithDataFrom(A input)?
  4. Class C as a static method B ConvertAtoB(A source)?
  5. ???

Solution

  • It depends, all make sense in different circumstances; some examples from Java:

    1. String java.lang.StringBuilder.toString()
    2. java.lang.StringBuilder(String source)
    3. void java.util.GregorianCalender.setTime(Date time)
    4. ArrayList<T> java.util.Collections.list(Enumeration<T> e)

    Some questions to help you decide:

    • Which dependency makes more sense? A dependent on B, B dependent on A, neither?
    • Do you always create a new B from an A, or do you need to fill existing Bs using As?
    • Are there other classes with similar collaborations, either as data providers for Bs or as targets for As data?