<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	
	>
<channel>
	<title>
	Comments on: To mock or not to mock	</title>
	<atom:link href="http://matteo.vaccari.name/blog/archives/54/feed" rel="self" type="application/rss+xml" />
	<link>http://matteo.vaccari.name/blog/archives/54</link>
	<description>Extreme enthusiasm</description>
	<lastBuildDate>
	Mon, 25 Feb 2019 15:18:16 +0000	</lastBuildDate>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=5.1.1</generator>
			<item>
				<title>
				By: matteo				</title>
				<link>http://matteo.vaccari.name/blog/archives/54/comment-page-1#comment-293</link>
		<dc:creator><![CDATA[matteo]]></dc:creator>
		<pubDate>Sat, 04 Nov 2006 14:01:22 +0000</pubDate>
		<guid isPermaLink="false">http://matteo.vaccari.name/blog/?p=54#comment-293</guid>
					<description><![CDATA[]]></description>
		<content:encoded><![CDATA[<p>Ciao Renzo,</p>
<p>grazie a te per la risposta anche più articolata di quello che avevo scritto io&#8230; :)</p>
<p>Sì, io scrivo sempre con il tono di &#8220;si fa COSI&#8217; e basta!&#8221; ma è certo che l&#8217;approccio giusto non è sempre lo stesso; dipende in parte dal tipo di applicazione ma soprattutto dal modo di ragionare, e anche dal livello di esperienza.  Mi pare di capire che se io e te ci mettessimo a lavorare in paio, passeremmo 9/10 del tempo a discutere&#8230; sarebbe divertente!  Ed è chiaro che hai un livello di esperienza e familiarità con l&#8217;O-O molto maggiore del mio.</p>
<p>Non credo che condividerei il tuo modo di lavorare, ma come tante altre cose forse occorre vedere il maestro in azione per capire bene come funziona.  (Ci sono libri o articoli che descrivono uno stile simile al tuo?)  Io penso fortemente state-based; per il mio modo di vedere imporre un ordine preciso nelle chiamate rappresenta un aumento dell&#8217;accoppiamento fra le classi, per cui cerco di evitare quando posso le dipendenze &#8220;temporali&#8221;.  Se devo dialogare con un server smtp, le chiamate vanno fatte in un ordine preciso (prima il mittente, poi i destinatari); ma se lo dovessi progettare io, renderei indifferente l&#8217;ordine delle chiamate.  Il fatto che i test non si rompano se cambio l&#8217;ordine delle chiamate lo vedo come un bonus :)</p>
<p>Tornando al caso di Jeff, credo che l&#8217;oggetto PortolioApplication fosse lì per rappresentare &#8220;il resto dell&#8217;applicazione&#8221; o meglio &#8220;un generico client di Portfolio&#8221;.  Non credo che Jeff sia solito mettere un grosso Singleton al centro dei suoi design :)</p>
<p>A me piace questo articolo soprattutto perché spiega i pro e i contro di due o tre approcci a un problema comune (come introdurre un mock minimizzando gli impatti sul codice sotto test) in maniera molto semplice.</p>
]]></content:encoded>
						</item>
						<item>
				<title>
				By: Renzo				</title>
				<link>http://matteo.vaccari.name/blog/archives/54/comment-page-1#comment-284</link>
		<dc:creator><![CDATA[Renzo]]></dc:creator>
		<pubDate>Fri, 03 Nov 2006 21:40:33 +0000</pubDate>
		<guid isPermaLink="false">http://matteo.vaccari.name/blog/?p=54#comment-284</guid>
					<description><![CDATA[Secondo me qui non c&#039;e&#039; un dogma assoluto, quindi hai ragione a preferire &quot;la tua strada&quot;. E&#039; possibile sviluppare un&#039;applicazione sia testando solo dal punto di vista dello stato che dal punto di vista dei collaboratori.

Io attualmente mi trovo bene sviluppando top-down partendo da un&#039;acceptance ed immergendo in componenti via via in contesti moccati, fino a raggiungere il confine del sistema, dove l&#039;ultimo mock viene comunemente chiamato stub. Ho applicato piu&#039; o meno tutti i tricks che Jeff descrive nel suo paper ed ho anche affrontato la difficolta&#039; del refactoring. Ma per me e&#039; non e&#039; proprio fatica, fa parte del gioco. Mi spiego.

Che tu lo faccia esplicitamente o no, prima di scrivere codice fai mentalmente o con i tuoi collaboratori una sessione CRC dove emergono dei poli di responsabilita&#039; (ad es. Controller, il Formatter, l&#039;Aggregator, il Parser ecc.) Questa costituisce una bozza, un filo conduttore che puo&#039; stabilizzarsi o prendere totalmente un&#039;altra strada in quanto applico un design evolutivo. Cominciando dall&#039;alto forzo il componente oggetto del test a comportarsi come vorrei, lo faccio parlare con i suoi presunti collaboratori e magari ne scopro di nuovi oppure scopro di averne troppi. Cosi&#039; la trama dei componenti cambia di continuo. 

Io voglio che questo colloquio stia nei test, non lo voglio semplicemente su un schizzo UML. Voglio che se cambio idea sulla responsabilita&#039; di un componente e sul contratto che esso espone (che puo&#039; essere mappato su piu&#039; chiamate a metodo, che puo&#039; richiedere un certo ordine o diversi flussi in base alle risposte) io sia forzato a renderne conto ai test. Questo mi costringe a chiedermi perche&#039; ho cambiato idea in rapporto al precedente schema CRC, se ho sbagliato, cosa posso migliorare la prossima volta.

Se non uso i mock, ma piu&#039; in specifico, se non scolpisco nei test cosa mi aspetto che venga chiamato, quando e come, perdo questo feedback. Per questo quando arriva il momento del refactoring sono contento, perche&#039; c&#039;e&#039; qualcosa da imparare. Se faccio TDD secco, verificando solo i valori, questo feedback lo perdo. D&#039;accordo che e&#039; fatica in piu&#039;, ma col tempo sono sempre piu&#039; veloce e soprattutto, le collaborazioni tra i miei oggetti sembrano sempre piu&#039; azzeccate. 

Una cosa che mi sorprende nel paper di Jeff e&#039; il fatto che non citi quello che secondo me e&#039; il motivo piu&#039; importante per utilizzare i mock in questo modo, ovvero guidare il design. Ci sono anche altre grossolanita&#039;: tu hai mai visto in un design OO dell&#039;applicazione X un oggetto che si chiama XApplication? Se si&#039;, e&#039; indice di mentalita&#039; procedurale. Secondo: quelle che lui chiama aumento delle dipendenze (proprio sull&#039;oggetto PortfolioApplication che normalmente non esiste) io lo chiamo IOC: sviluppare via mock ti da gratis inversione di controllo. Credo siano ormai noti i benefici di questo approccio. E poi vabbe&#039;, dappertutto si cita come negativo il fatto che l&#039;approccio generi decisioni a livello di design quand&#039;e&#039; esattamente quello a cui mi serve...

Grazie Matteo per l&#039;ottimo spunto.
A presto
Renzo]]></description>
		<content:encoded><![CDATA[<p>Secondo me qui non c&#8217;e&#8217; un dogma assoluto, quindi hai ragione a preferire &#8220;la tua strada&#8221;. E&#8217; possibile sviluppare un&#8217;applicazione sia testando solo dal punto di vista dello stato che dal punto di vista dei collaboratori.</p>
<p>Io attualmente mi trovo bene sviluppando top-down partendo da un&#8217;acceptance ed immergendo in componenti via via in contesti moccati, fino a raggiungere il confine del sistema, dove l&#8217;ultimo mock viene comunemente chiamato stub. Ho applicato piu&#8217; o meno tutti i tricks che Jeff descrive nel suo paper ed ho anche affrontato la difficolta&#8217; del refactoring. Ma per me e&#8217; non e&#8217; proprio fatica, fa parte del gioco. Mi spiego.</p>
<p>Che tu lo faccia esplicitamente o no, prima di scrivere codice fai mentalmente o con i tuoi collaboratori una sessione CRC dove emergono dei poli di responsabilita&#8217; (ad es. Controller, il Formatter, l&#8217;Aggregator, il Parser ecc.) Questa costituisce una bozza, un filo conduttore che puo&#8217; stabilizzarsi o prendere totalmente un&#8217;altra strada in quanto applico un design evolutivo. Cominciando dall&#8217;alto forzo il componente oggetto del test a comportarsi come vorrei, lo faccio parlare con i suoi presunti collaboratori e magari ne scopro di nuovi oppure scopro di averne troppi. Cosi&#8217; la trama dei componenti cambia di continuo. </p>
<p>Io voglio che questo colloquio stia nei test, non lo voglio semplicemente su un schizzo UML. Voglio che se cambio idea sulla responsabilita&#8217; di un componente e sul contratto che esso espone (che puo&#8217; essere mappato su piu&#8217; chiamate a metodo, che puo&#8217; richiedere un certo ordine o diversi flussi in base alle risposte) io sia forzato a renderne conto ai test. Questo mi costringe a chiedermi perche&#8217; ho cambiato idea in rapporto al precedente schema CRC, se ho sbagliato, cosa posso migliorare la prossima volta.</p>
<p>Se non uso i mock, ma piu&#8217; in specifico, se non scolpisco nei test cosa mi aspetto che venga chiamato, quando e come, perdo questo feedback. Per questo quando arriva il momento del refactoring sono contento, perche&#8217; c&#8217;e&#8217; qualcosa da imparare. Se faccio TDD secco, verificando solo i valori, questo feedback lo perdo. D&#8217;accordo che e&#8217; fatica in piu&#8217;, ma col tempo sono sempre piu&#8217; veloce e soprattutto, le collaborazioni tra i miei oggetti sembrano sempre piu&#8217; azzeccate. </p>
<p>Una cosa che mi sorprende nel paper di Jeff e&#8217; il fatto che non citi quello che secondo me e&#8217; il motivo piu&#8217; importante per utilizzare i mock in questo modo, ovvero guidare il design. Ci sono anche altre grossolanita&#8217;: tu hai mai visto in un design OO dell&#8217;applicazione X un oggetto che si chiama XApplication? Se si&#8217;, e&#8217; indice di mentalita&#8217; procedurale. Secondo: quelle che lui chiama aumento delle dipendenze (proprio sull&#8217;oggetto PortfolioApplication che normalmente non esiste) io lo chiamo IOC: sviluppare via mock ti da gratis inversione di controllo. Credo siano ormai noti i benefici di questo approccio. E poi vabbe&#8217;, dappertutto si cita come negativo il fatto che l&#8217;approccio generi decisioni a livello di design quand&#8217;e&#8217; esattamente quello a cui mi serve&#8230;</p>
<p>Grazie Matteo per l&#8217;ottimo spunto.<br />
A presto<br />
Renzo</p>
]]></content:encoded>
						</item>
			</channel>
</rss>
