Thanks for the answer Ben and Stephane. I already read A Mentoring Course on Smalltalk, Valloud, there is nothing there I could use in this case :( . I will look after for The Design Patterns Smalltalk Companion. Most of the sources provided I already know of or went in the same lines lines of what I have already found.
About TDD, I am experienced with the discipline and have tested it on Pharo living system already, but I could not understand how this is related with object wiring, DI and service locator. >From ben: "I'm not really familiar with IoC or DI patterns, so just taking your > example at face value, in Pharo I'd do... > > MovieLister>>moviesDirectedBy: director > allMovies := finder allMovies. > ^ allMovies select: [ :movie | movie getDirector = director ]. > "although typically #getDirector would be renamed #director" > > MovieLister>>finder: movieFinder > finder := movieFinder. > > to be used like this... > lister := MovieLister new finder: (ColonDelimitedMovieFinder on: > 'movies1.txt'). > movies := lister moviesDirectedBy: 'Tarantino'." and Stephane: Why don't you simply pass the class and use that class in your MovieLister? > > MovieLister new > finderClass: MySuperCoolFinderClass > > ... > MovieLister finder > finderClass new ..... > > What is wrong with that. That was what I meant when I said: "I know that in Smalltalk I can make MovieLister to receive, upon construction, a class representing MovieFinder and call it construction message.". The code I had in mind is a bit of mix from the one provided by you both: MovieLister>>moviesDirectedBy: director allMovies := finder allMovies. ^ allMovies select: [ :movie | movie getDirector = director ]. "although typically #getDirector would be renamed #director" MovieLister>>finder: aMovieFinderBuilder finder := aMovieFinderClass new. to be used like this... lister := MovieLister new finder: (ColonDelimitedMovieFinder builderOn: 'movies1.txt'). movies := lister moviesDirectedBy: 'Tarantino'." But that means I will have to wire dependencies by hand whenever I create a MovieLister and seek through code when and if those dependencies change. When there are lot's of dependencies it's is a considerable and tedious work. Let's see an image from Fowlers article: [image: Inline image 1] In this case, the service locator provides me with an instance and I configure the instance in the assembler, the scheme is alike for an IoC, and that would mean my implementation could be like this: MovieLister>>moviesDirectedBy: director allMovies := finder allMovies. ^ allMovies select: [ :movie | movie getDirector = director ]. "although typically #getDirector would be renamed #director" MovieLister>>initialize finder := ServiceLocator locate: FinderClass <--- This would bring the instance of finder class configured by the assembler to be used like this... lister := MovieLister new. movies := lister moviesDirectedBy: 'Tarantino'." and the assembler: Assember class>>configure: aMap put: (ColonDelimitedMovieFinder builderOn: 'movies1.txt') at: FinderClass My assembler and service locator could be even more elaborated, and provide a different MovieFinder in test scope, for different classes or wharever. It is a little convenience for Smalltalk, I will give that, but I was wandering if there was something alike in Pharo, by your answers I assuming there is nothing like that. If you do not want to have a reference at runtime to a Finder then you > need to use announcement and registration. I didn't understand that, could you elaborate? On Mon, Jun 5, 2017 at 6:41 AM, Stephane Ducasse <stepharo.s...@gmail.com> wrote: > Why don't you simply pass the class and use that class in your MovieLister? > > MovieLister new > finderClass: MySuperCoolFinderClass > > ... > MovieLister finder > finderClass new ..... > > What is wrong with that. > > If you do not want to have a reference at runtime to a Finder then you > need to use announcement and registration. > > Stef > > > > On Sun, Jun 4, 2017 at 11:17 PM, Vitor Medina Cruz <vitormc...@gmail.com> > wrote: > > Hello, > > > > I would like to know how people in Pharo ecosystem do to deal with object > > wiring, as described by Marting Fowler in > > https://martinfowler.com/articles/injection.html# > FormsOfDependencyInjection: > > > > "A common issue to deal with is how to wire together different elements: > how > > do you fit together this web controller architecture with that database > > interface backing when they were built by different teams with little > > knowledge of each other." > > > > He gives an example, I will leave it in java as it is simple enough to > > understand: > > > > "class MovieLister... > > > > public Movie[] moviesDirectedBy(String arg) { > > List allMovies = finder.findAll(); > > for (Iterator it = allMovies.iterator(); it.hasNext();) { > > Movie movie = (Movie) it.next(); > > if (!movie.getDirector().equals(arg)) it.remove(); > > } > > return (Movie[]) allMovies.toArray(new Movie[allMovies.size()]); > > > > }" > > > > The question is how to provide the finder object in a decoupled matter, a > > naive approach would be: > > > > " private MovieFinder finder; > > > > public MovieLister() { > > finder = new ColonDelimitedMovieFinder("movies1.txt"); > > > > }" > > > > Which couples the MovieLister to the specific ColonDelimitedMovieFinder > > class. > > > > Fowler explains how to decouple using an IoC framework or a Service > Locator. > > In Java and .Net IoC is used most of the time. I Googled how this > problem is > > approached in Smalltalk/Pharo, and I generally I found answers "that is > easy > > to do in Smalltalk, so there is no need of a framework", what I miss is a > > description on *how* to do that: > > > > https://stackoverflow.com/questions/243905/smalltalk-and-ioc > > https://stackoverflow.com/questions/2684326/is-there-a- > dependency-injection-framework-for-smalltalk > > https://stackoverflow.com/questions/243905/smalltalk- > and-ioc/347477#347477 > > > > I know that in Smalltalk I can make MovieLister to receive, upon > > construction, a class representing MovieFinder and call it construction > > message. As long an object that responds to this message is provided, I > can > > create as many derivations I want and the MovieLister will be decoupled > from > > the MovieFinder. That way, however, I still have to wire things by hand, > and > > I am not sure if this is what I am supposed to do in order to solve the > > decouple problem. > > > > Can you explain me how this is done in Pharo? It's is usually wiring by > > hand? Is there a simple construction that deals with the wiring problem > that > > I cannot foresee? > > > > Thanks in advance, > > Vitor > > > > > > > >