<?xml version="1.0" encoding="UTF-8"?><!-- generator="wordpress/2.0.3" -->
<rss version="2.0" 
	xmlns:content="http://purl.org/rss/1.0/modules/content/">
<channel>
	<title>Comments on: null-referanser</title>
	<link>http://blog.kjempekjekt.com/2009/06/21/null-referanser/</link>
	<description>om livet som .net utvikler</description>
	<pubDate>Fri, 30 Jul 2010 17:50:09 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.0.3</generator>

	<item>
		<title>by: Torbjørn</title>
		<link>http://blog.kjempekjekt.com/2009/06/21/null-referanser/#comment-56736</link>
		<pubDate>Tue, 23 Jun 2009 11:32:19 +0000</pubDate>
		<guid>http://blog.kjempekjekt.com/2009/06/21/null-referanser/#comment-56736</guid>
					<description>Nja, jeg vet ikke om det er så mye bedre. Men nå har jeg eksperimentert litt mer, og ser at jeg oppnår veldig lesbar kode. Se for eksempel her:

public UserCommandResult Execute()
{
var item = GetItem();
if (item.WasNotFound()) return ItemNotFoundResult();
if (item.CanNotBeCarried()) return ItemCanNotBeCarriedResult();
PickUp(item);
return SuccessResult();
}

Her skjuler det seg to null-tester.., men de er implementasjonsdetaljer. Koden lar seg nå lese som en god historie. \&quot;If item can not be carried return item can not be carried result.\&quot; Føles veldig riktig for meg.

&lt;strong&gt;Update:&lt;/strong&gt; Merk at dette ikke er generelle extension methods for object. WasNotFound() skjekker derimot enkelt og greit om Item == null, mens CanNotBeCarried() bruker \&quot;as\&quot; nøkkelordet i C# til å kaste item til ICanBeCarried interfacet, og sjekker om resultatet av det er null. CanNotBeCarried() vil jeg ikke plassere på Item direkte, item er lukket for den type endringer. Etterhvert som jeg legger til flere item-egenskaper i form av ulike interfacer kan jeg legge til flere slike metoder uten å måtte endre Item.</description>
		<content:encoded><![CDATA[<p>Nja, jeg vet ikke om det er så mye bedre. Men nå har jeg eksperimentert litt mer, og ser at jeg oppnår veldig lesbar kode. Se for eksempel her:</p>
<p>public UserCommandResult Execute()<br />
{<br />
var item = GetItem();<br />
if (item.WasNotFound()) return ItemNotFoundResult();<br />
if (item.CanNotBeCarried()) return ItemCanNotBeCarriedResult();<br />
PickUp(item);<br />
return SuccessResult();<br />
}</p>
<p>Her skjuler det seg to null-tester.., men de er implementasjonsdetaljer. Koden lar seg nå lese som en god historie. \&#8221;If item can not be carried return item can not be carried result.\&#8221; Føles veldig riktig for meg.</p>
<p><strong>Update:</strong> Merk at dette ikke er generelle extension methods for object. WasNotFound() skjekker derimot enkelt og greit om Item == null, mens CanNotBeCarried() bruker \&#8221;as\&#8221; nøkkelordet i C# til å kaste item til ICanBeCarried interfacet, og sjekker om resultatet av det er null. CanNotBeCarried() vil jeg ikke plassere på Item direkte, item er lukket for den type endringer. Etterhvert som jeg legger til flere item-egenskaper i form av ulike interfacer kan jeg legge til flere slike metoder uten å måtte endre Item.
</p>
]]></content:encoded>
				</item>
	<item>
		<title>by: henningst</title>
		<link>http://blog.kjempekjekt.com/2009/06/21/null-referanser/#comment-56733</link>
		<pubDate>Tue, 23 Jun 2009 11:11:01 +0000</pubDate>
		<guid>http://blog.kjempekjekt.com/2009/06/21/null-referanser/#comment-56733</guid>
					<description>Glenn Block advarte også om over-ivrig bruk av extension methods på generelle objekter i foredraget om framework design guidelines. Han sa bl.a. at det ikke bør benyttes på object. Mulig IsNotSetYet()/IsSet() kan være et unntak siden dette er en helt generell sjekk, men er det så mye penere enn å sjekke direkte for null da?</description>
		<content:encoded><![CDATA[<p>Glenn Block advarte også om over-ivrig bruk av extension methods på generelle objekter i foredraget om framework design guidelines. Han sa bl.a. at det ikke bør benyttes på object. Mulig IsNotSetYet()/IsSet() kan være et unntak siden dette er en helt generell sjekk, men er det så mye penere enn å sjekke direkte for null da?
</p>
]]></content:encoded>
				</item>
	<item>
		<title>by: Torbjørn</title>
		<link>http://blog.kjempekjekt.com/2009/06/21/null-referanser/#comment-56515</link>
		<pubDate>Sun, 21 Jun 2009 15:27:37 +0000</pubDate>
		<guid>http://blog.kjempekjekt.com/2009/06/21/null-referanser/#comment-56515</guid>
					<description>Punkt 2 først: Mener fortsatt det er feil å si at jeg har duplisert kode, men jeg skjønner hva du mener. Forslaget ditt fungere om du endrer det til return !o.IsSet();

Punkt 1, om jeg ville ha laget en IsReallyNotACustomer? Det kommer an på om jeg trengte det for å skrive lesbar kode. Kanskje har jeg behov for å sjekke at noe ikke er null, kanskje er behove å sjekke at det er null, kanskje er det begge deler. Jeg skriver ingen av dem før jeg ser at jeg behøver dem.</description>
		<content:encoded><![CDATA[<p>Punkt 2 først: Mener fortsatt det er feil å si at jeg har duplisert kode, men jeg skjønner hva du mener. Forslaget ditt fungere om du endrer det til return !o.IsSet();</p>
<p>Punkt 1, om jeg ville ha laget en IsReallyNotACustomer? Det kommer an på om jeg trengte det for å skrive lesbar kode. Kanskje har jeg behov for å sjekke at noe ikke er null, kanskje er behove å sjekke at det er null, kanskje er det begge deler. Jeg skriver ingen av dem før jeg ser at jeg behøver dem.
</p>
]]></content:encoded>
				</item>
	<item>
		<title>by: Halvard</title>
		<link>http://blog.kjempekjekt.com/2009/06/21/null-referanser/#comment-56498</link>
		<pubDate>Sun, 21 Jun 2009 13:07:00 +0000</pubDate>
		<guid>http://blog.kjempekjekt.com/2009/06/21/null-referanser/#comment-56498</guid>
					<description>Gode svar, jeg er veldig tilbøyelig til å være enig!

Angående kodeduplisering;

1.
Ville du også lagd en metode customer.IsReallyNotACustomer() ?

2.
Du har jo duplisert koden &lt;i&gt;inni&lt;/i&gt; metodene &lt;i&gt;IsSet&lt;/i&gt; og &lt;i&gt;IsNotSetYet&lt;/i&gt; (selv om de tilsynelatende gjør motsatte ting)? 

Vet du hvordan det virker i extension methods, kan man f.eks. skrive slik

public static bool IsNotSetYet(this object o)
{
  return ! IsSet(o);
}

for å unngå kodeduplisering?</description>
		<content:encoded><![CDATA[<p>Gode svar, jeg er veldig tilbøyelig til å være enig!</p>
<p>Angående kodeduplisering;</p>
<p>1.<br />
Ville du også lagd en metode customer.IsReallyNotACustomer() ?</p>
<p>2.<br />
Du har jo duplisert koden <i>inni</i> metodene <i>IsSet</i> og <i>IsNotSetYet</i> (selv om de tilsynelatende gjør motsatte ting)? </p>
<p>Vet du hvordan det virker i extension methods, kan man f.eks. skrive slik</p>
<p>public static bool IsNotSetYet(this object o)<br />
{<br />
  return ! IsSet(o);<br />
}</p>
<p>for å unngå kodeduplisering?
</p>
]]></content:encoded>
				</item>
	<item>
		<title>by: Torbjørn</title>
		<link>http://blog.kjempekjekt.com/2009/06/21/null-referanser/#comment-56496</link>
		<pubDate>Sun, 21 Jun 2009 12:54:14 +0000</pubDate>
		<guid>http://blog.kjempekjekt.com/2009/06/21/null-referanser/#comment-56496</guid>
					<description>Misforstå meg rett, jeg sier ikke at vi kun kan referere null i mine to extension methods, og bruke dem alle steder hvor vi bruker null i dag. Det ville ikke være noe spesielt fremskritt. Og jeg har ingen erfaring med disse metodene enda heller.., så la meg eksperimentere litt først, så ser vi hvor jeg ender :).

Vi er enige om at mye null i kode er en uting, som var budskapet mitt..</description>
		<content:encoded><![CDATA[<p>Misforstå meg rett, jeg sier ikke at vi kun kan referere null i mine to extension methods, og bruke dem alle steder hvor vi bruker null i dag. Det ville ikke være noe spesielt fremskritt. Og jeg har ingen erfaring med disse metodene enda heller.., så la meg eksperimentere litt først, så ser vi hvor jeg ender <img src='http://blog.kjempekjekt.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> .</p>
<p>Vi er enige om at mye null i kode er en uting, som var budskapet mitt..
</p>
]]></content:encoded>
				</item>
	<item>
		<title>by: Torbjørn</title>
		<link>http://blog.kjempekjekt.com/2009/06/21/null-referanser/#comment-56491</link>
		<pubDate>Sun, 21 Jun 2009 12:19:38 +0000</pubDate>
		<guid>http://blog.kjempekjekt.com/2009/06/21/null-referanser/#comment-56491</guid>
					<description>Takk for kommentarene, Halvard. Her er mine..

&lt;i&gt;&quot;En utvikler som ser koden din for første gang vil ikke nødvendigvis vite hva som skjer der&quot;&lt;/i&gt;

Det gjør overhodet ingen ting. Som utviklere bør vi søke høyere abstraksjoner, og fjerne oss fra den implisite koden vi bedriver. Skriv kode som forteller &quot;hva&quot; og &quot;hvorfor&quot;, ikke &quot;hvordan&quot;. Når vi ser kode som i += 1; så tenker vi ikke på hvilke maskininstruksjoner som må til for å få til dette - vi har gått et steg videre. Og jo høyere abstraksjonsnivå vi kan tenke i, jo mer vil vi får gjort. Hvis jeg skriver kode som customer.IsReallyACustomer() så behøver ikke du å bry deg om at det er implementert som customer != null på nivået under. Ikke før du beveger deg ned på det nivået.., og da ser du det.

!= null er noe vi er vandt til, og derfor er det leselig, og vi ønsker å beholde det vandte og trygge. Men skal vi utvikle oss så må noe vike.

&lt;i&gt;&quot;Å ha både IsSet() og IsNotSetYet() er vel kodeduplisering?&quot;&lt;/i&gt;

Ikke mer duplisering enn å ha både == og !=. I stedet for a!=b burde vi skrive !(a==b). Og hvorfor har vi både &amp;&amp; og &amp;#124;&amp;#124;? Vi kan klare oss lenge med bare &amp;#124;&amp;#124; og litt negering, kan vi ikke? 

Ved å ha IsNotSetYet() så slipper jeg å skrive !o.IsSet(), som er helt uforståelig for alle andre enn dem som er vandt til et programmeringsspråk som benytter ! for negering. For ikke å snakke om hvor lett det er å overse det ene tegnet. Nei, den type duplisering, om du vil kalle det det, er jeg ikke redd for.

&lt;i&gt;&quot;Så hvor bør man plassere ObjectExtensions?&quot;&lt;/i&gt;

Det er et viktig spørsmål. For tiden har jeg noen små &quot;Marosoft.*&quot; assemblies jeg referere overalt, som inneholder helt generiske ting - og slik jeg bruker dem passer ObjectExtensions inn der. Jeg ser på dem som en extension til System-namespacet. 

Men jeg er usikker på om jeg vil bruke disse generiske IsSet og IsNotSetYet, eller om jeg vil lage mere domene-spesifike versjoner, og da plassere dem der hvor de hører hjemme.

Det Uncle Bob har å si om komponenter er utrolig spennende (ikke at jeg ikke sluker rått alt det andre han sier også).</description>
		<content:encoded><![CDATA[<p>Takk for kommentarene, Halvard. Her er mine..</p>
<p><i>&#8220;En utvikler som ser koden din for første gang vil ikke nødvendigvis vite hva som skjer der&#8221;</i></p>
<p>Det gjør overhodet ingen ting. Som utviklere bør vi søke høyere abstraksjoner, og fjerne oss fra den implisite koden vi bedriver. Skriv kode som forteller &#8220;hva&#8221; og &#8220;hvorfor&#8221;, ikke &#8220;hvordan&#8221;. Når vi ser kode som i += 1; så tenker vi ikke på hvilke maskininstruksjoner som må til for å få til dette - vi har gått et steg videre. Og jo høyere abstraksjonsnivå vi kan tenke i, jo mer vil vi får gjort. Hvis jeg skriver kode som customer.IsReallyACustomer() så behøver ikke du å bry deg om at det er implementert som customer != null på nivået under. Ikke før du beveger deg ned på det nivået.., og da ser du det.</p>
<p>!= null er noe vi er vandt til, og derfor er det leselig, og vi ønsker å beholde det vandte og trygge. Men skal vi utvikle oss så må noe vike.</p>
<p><i>&#8220;Å ha både IsSet() og IsNotSetYet() er vel kodeduplisering?&#8221;</i></p>
<p>Ikke mer duplisering enn å ha både == og !=. I stedet for a!=b burde vi skrive !(a==b). Og hvorfor har vi både &#038;&#038; og ||? Vi kan klare oss lenge med bare || og litt negering, kan vi ikke? </p>
<p>Ved å ha IsNotSetYet() så slipper jeg å skrive !o.IsSet(), som er helt uforståelig for alle andre enn dem som er vandt til et programmeringsspråk som benytter ! for negering. For ikke å snakke om hvor lett det er å overse det ene tegnet. Nei, den type duplisering, om du vil kalle det det, er jeg ikke redd for.</p>
<p><i>&#8220;Så hvor bør man plassere ObjectExtensions?&#8221;</i></p>
<p>Det er et viktig spørsmål. For tiden har jeg noen små &#8220;Marosoft.*&#8221; assemblies jeg referere overalt, som inneholder helt generiske ting - og slik jeg bruker dem passer ObjectExtensions inn der. Jeg ser på dem som en extension til System-namespacet. </p>
<p>Men jeg er usikker på om jeg vil bruke disse generiske IsSet og IsNotSetYet, eller om jeg vil lage mere domene-spesifike versjoner, og da plassere dem der hvor de hører hjemme.</p>
<p>Det Uncle Bob har å si om komponenter er utrolig spennende (ikke at jeg ikke sluker rått alt det andre han sier også).
</p>
]]></content:encoded>
				</item>
	<item>
		<title>by: Halvard</title>
		<link>http://blog.kjempekjekt.com/2009/06/21/null-referanser/#comment-56467</link>
		<pubDate>Sun, 21 Jun 2009 09:04:59 +0000</pubDate>
		<guid>http://blog.kjempekjekt.com/2009/06/21/null-referanser/#comment-56467</guid>
					<description>Veldig interessant! Er absolutt enig i at null i koden er en uting.

Men:
Jeg vil argumentere for å ikke erstatte != null der hvor man faktisk trenger det, fordi dette er mer leselig. Ja, du leste riktig. MER leselig rett og slett fordi vi programmerere er så vante med å bruke det. En utvikler som ser koden din for første gang vil ikke nødvendigvis vite hva som skjer der, og da virker det mot sin hensikt. 

Et spørsmål til koden din:
Å ha både IsSet() og IsNotSetYet() er vel kodeduplisering?

Så en kommentar til extension methods:
Utvidelsesmetoder er virkelig kraftige saker. På NDC nå kommenterte jo selveste Robert Martin at dette var nyttig i noen sammenhenger, men at det er lett å gå feil. For eksempel er det ekstremt viktig at man plasserer slike utvidelsesmetoder i riktige assemblies. Problemet blir jo at når man refererer et assembly som inneholder utvidelsesmetoder at det er lett å bli bundet opp til assembliet pga utvidelsesmetodene i assembliet og ikke pga det man egentlig trengte assembliet for. Så hvor bør man plassere ObjectExtensions? Sannsynligvis i en assembly som all koden din bruker uansett. Eller?</description>
		<content:encoded><![CDATA[<p>Veldig interessant! Er absolutt enig i at null i koden er en uting.</p>
<p>Men:<br />
Jeg vil argumentere for å ikke erstatte != null der hvor man faktisk trenger det, fordi dette er mer leselig. Ja, du leste riktig. MER leselig rett og slett fordi vi programmerere er så vante med å bruke det. En utvikler som ser koden din for første gang vil ikke nødvendigvis vite hva som skjer der, og da virker det mot sin hensikt. </p>
<p>Et spørsmål til koden din:<br />
Å ha både IsSet() og IsNotSetYet() er vel kodeduplisering?</p>
<p>Så en kommentar til extension methods:<br />
Utvidelsesmetoder er virkelig kraftige saker. På NDC nå kommenterte jo selveste Robert Martin at dette var nyttig i noen sammenhenger, men at det er lett å gå feil. For eksempel er det ekstremt viktig at man plasserer slike utvidelsesmetoder i riktige assemblies. Problemet blir jo at når man refererer et assembly som inneholder utvidelsesmetoder at det er lett å bli bundet opp til assembliet pga utvidelsesmetodene i assembliet og ikke pga det man egentlig trengte assembliet for. Så hvor bør man plassere ObjectExtensions? Sannsynligvis i en assembly som all koden din bruker uansett. Eller?
</p>
]]></content:encoded>
				</item>
</channel>
</rss>
