Hi Bhathiya,

The issue you have highlighted(Avoid fat constructor) is addressed by
Google Guice, so you dont need to have multiple constructors[1] since Guice
will take care of building the object for you. Having an alternative
constructor like the above introduces 3 lines of code that is not unit
testable :)

Please watch[2] for a demonstration of practical usage.

[1] https://github.com/google/guice/wiki/GettingStarted
[2] https://www.youtube.com/watch?v=hBVJbzAagfs

On 31 October 2016 at 14:56, Bhathiya Jayasekara <[email protected]> wrote:

> Hi Uvindra,
>
> On Mon, Oct 31, 2016 at 1:54 PM, Uvindra Dias Jayasinha <[email protected]>
> wrote:
>
>> +architecture
>>
>> This initially began as an internal APIM discussion for avoiding hard
>> coded dependencies within the code we are writing for C5 to make them more
>> unit testable(Being able to do dependency injection[1]). But as suggested
>> by Akila I think this is a good thing to talk about publicly as all
>> products can benefit.
>>
>> Akila suggested using something like Google Juice[2] for this purpose. Im
>> +1 for using this. Would like to here your thoughts on this.
>>
>> [1] https://www.youtube.com/watch?v=IKD2-MAkXyQ
>> [2] https://github.com/google/guice
>>
>>
>> On 31 October 2016 at 13:06, Uvindra Dias Jayasinha <[email protected]>
>> wrote:
>>
>>>
>>>
>>>> *The solution*
>>>>> Pass an instance of the interface to the heavy weight resource as a
>>>>> constructor parameter to the class that needs to use it. So in this case 
>>>>> it
>>>>> should be,
>>>>>
>>>>> public APIConsumerImpl(ApiDAO apiDAO, ApplicationDAO appDAO,
>>>>> APISubscriptionDAO apiSubscriptionDAO) {
>>>>>     this.apiDAO = apiDAO;
>>>>>     this.appDAO = appDAO;
>>>>>     this.apiSubscriptionDAO = apiSubscriptionDAO;
>>>>> }
>>>>>
>>>>> Passing it this way means we can now provide a mock implementation of
>>>>> the DOA interfaces when constructing the Consumer and Provider classes
>>>>> using a library such as mockito[1] and easily write unit tests.
>>>>>
>>>>
> +1 for above constructor to be used in unit tests. But I don't think we
> can use the same for real use. For that, we can have a default constructor
> as well, so that clients don't need to worry about injecting DAO
> dependencies.
>
> public APIConsumerImpl() {
>     this.apiDAO = DAOFactory.getApiDAO();
>     this.appDAO = DAOFactory.getAppDAO();
>     this.apiSubscriptionDAO = DAOFactory.getSubscriptionDAO();
> }
>
> Thanks,
>
> --
> *Bhathiya Jayasekara*
> *Senior Software Engineer,*
> *WSO2 inc., http://wso2.com <http://wso2.com>*
>
> *Phone: +94715478185 <%2B94715478185>*
> *LinkedIn: http://www.linkedin.com/in/bhathiyaj
> <http://www.linkedin.com/in/bhathiyaj>*
> *Twitter: https://twitter.com/bhathiyax <https://twitter.com/bhathiyax>*
> *Blog: http://movingaheadblog.blogspot.com
> <http://movingaheadblog.blogspot.com/>*
>



-- 
Regards,
Uvindra

Mobile: 777733962
_______________________________________________
Architecture mailing list
[email protected]
https://mail.wso2.org/cgi-bin/mailman/listinfo/architecture

Reply via email to