<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	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/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Alt om ingenting og litt i mellom &#187; modularitet</title>
	<atom:link href="http://hovenko.no/blog/tag/modularitet/feed/" rel="self" type="application/rss+xml" />
	<link>https://hovenko.no/blog</link>
	<description>En blogg av Knut-Olav</description>
	<lastBuildDate>Mon, 10 Mar 2025 19:25:02 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Programkode og modulbasert arkitektur</title>
		<link>https://hovenko.no/blog/2011/03/01/programkode-og-modulbasert-arkitektur/</link>
		<comments>https://hovenko.no/blog/2011/03/01/programkode-og-modulbasert-arkitektur/#comments</comments>
		<pubDate>Tue, 01 Mar 2011 19:32:23 +0000</pubDate>
		<dc:creator>Knut-Olav</dc:creator>
				<category><![CDATA[Arkitektur]]></category>
		<category><![CDATA[Teknologi]]></category>
		<category><![CDATA[arkitektur]]></category>
		<category><![CDATA[design]]></category>
		<category><![CDATA[IT]]></category>
		<category><![CDATA[modularitet]]></category>
		<category><![CDATA[prosjektstyring]]></category>

		<guid isPermaLink="false">http://hovenko.no/blog/?p=586</guid>
		<description><![CDATA[Med modulbasert arkitektur gjelder det å dele opp systemet som skal lages i moduler av håndterbar mengde kode og funksjonalitet, hvor hver modul er ekspert på sitt ansvarsområde og eksponeres til resten av systemet igjennom veldefinerte grensesnitt. Utenfra fungerer en modul som en sort boks; man gir beskjeder inn og man får svar tilbake. Man [...]]]></description>
			<content:encoded><![CDATA[<p>Med modulbasert arkitektur gjelder det å dele opp systemet som skal lages i moduler av håndterbar mengde kode og funksjonalitet, hvor hver modul er ekspert på sitt ansvarsområde og eksponeres til resten av systemet igjennom veldefinerte grensesnitt.</p>
<div class="wp-caption alignnone"><a href="http://www.flickr.com/photos/create_joy/4291306755/"><img alt="" src="http://farm5.static.flickr.com/4013/4291306755_dd271b1021.jpg" title="Puslespill (Puzzle). Foto: Flickr/create_joy (CC)" width="500" height="357" /></a><p class="wp-caption-text">Puslespill (Puzzle). Foto: Flickr/create_joy (CC)</p></div>
<p>Utenfra fungerer en modul som en sort boks; man gir beskjeder inn og man får svar tilbake. Man vet ikke hvordan den sorte boksen kommer frem til svaret. Det gjør det enklere å forholde seg til støttefunksjoner, så man kan fokusere på den funksjonaliteten man skal lage. Jeg kaller det støttefunksjoner fordi disse funksjonene ikke er viktige; eller rettere sagt så er funksjonaliteten man arbeider med for øyeblikket mye viktigere enn en hvilken som helst annen annen modul.</p>
<h3>Vedlikeholdbarhet</h3>
<p>Behovet for modulbasert arkitektur oppstår når systemer blir for store til at én eller to personer kan ha oversikt over hele systemet. Da blir det viktig med vedlikeholdbare moduler av håndterbare mengder med kode.</p>
<p>Vedlikeholdbarhet betyr ikke at koden til stadighet må endres, noe som faktisk fungerer mot sin hensikt. Dersom modulen endres for ofte med for store endringer kan det innføre feil. Mye ny funksjonalitet kan gjøre modulen uoversiktlig og mindre vedlikeholdbar. En vedlikeholdbar modul bidrar til at resten av systemet får en tydelig måte å kommunisere med modulen på, og dersom man støter på feil så skal man klare å fikse feilen.</p>
<h3>Eksempel på modulbasert løsning</h3>
<div id="attachment_601" class="wp-caption aligncenter"><a href="http://hovenko.no/blog/wp-content/uploads/2011/02/modulbasert-arkitektur.png"><img src="http://hovenko.no/blog/wp-content/uploads/2011/02/modulbasert-arkitektur-500x288.png" alt="" title="Modulbasert Arkitektur - eksempel" width="500" height="288" class="size-medium wp-image-601" /></a><p class="wp-caption-text">Et svært enkelt og overordnet eksempel på en modulbasert nettbutikkløsning</p></div>
<p>Kjernen av <em>MyWebShop</em> kommuniserer mot eksterne komponenter over definerte grensesnitt. Det er ikke sikkert at alle komponenter har grensesnitt basert på åpne standarder, som SQL, SMTP og HTTP. Det kan være behov for å definere nye grensesnitt i bedriften. For eksempel kan kommunikasjon mot et CMS-system skje via et nytt grensesnitt vi kaller <em>ProductService</em> som tilbyr funksjoner som er nyttige for vår nettbutikk. På denne måten definerer vi tydelig hvilke funksjoner nettbutikken har behov for, samtidig som vi skjuler andre funksjoner som CMS-systemet tilbyr som ikke er viktige for vårt system.</p>
<p>Når kommunikasjon mellom moduler foregår over definerte grensesnitt, så kan moduler byttes ut med ny moduler ved behov. For eksempel kan modulen <em>My Simple CMS</em> byttes ut med et mer avansert og bedre CMS-system dersom nettbutikken vår blir større og får nye behov som den gamle modulen ikke kan tilby. Om den nye modulen ikke støtter det samme grensesnittet som den gamle kan man lage et veldig lite oversettingslag, kalt for et adapter, som oversetter mellom vårt eget <em>ProductService</em>-grensesnitt og den nye modulen.</p>
<h3>Samhandling</h3>
<p>Et ofte brukt tilfelle av modulbasert programvare er når data skal behandles i flere ledd. Samme grensesnitt kan brukes i front av flere forskjellige moduler. For eksempel kan et spamfilter kobles på foran e-posttjeneren slik at e-post kan filtreres før det lagres i brukerens innboks, og uønsket e-post kastes uten at brukeren ser e-posten. Fordelen med modulbasert arkitektur er klar, man får et mer oversiktlig system med komponenter som kan settes sammen og byttes ut ved behov.</p>
]]></content:encoded>
			<wfw:commentRss>https://hovenko.no/blog/2011/03/01/programkode-og-modulbasert-arkitektur/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Tenk modularitet</title>
		<link>https://hovenko.no/blog/2007/11/02/tenk-modularitet/</link>
		<comments>https://hovenko.no/blog/2007/11/02/tenk-modularitet/#comments</comments>
		<pubDate>Thu, 01 Nov 2007 22:10:47 +0000</pubDate>
		<dc:creator>Knut-Olav</dc:creator>
				<category><![CDATA[Programmering]]></category>
		<category><![CDATA[Teknologi]]></category>
		<category><![CDATA[best practices]]></category>
		<category><![CDATA[modularitet]]></category>
		<category><![CDATA[refaktorering]]></category>

		<guid isPermaLink="false">http://www.hoven.ws/blog/2007/11/02/tenk-modularitet/</guid>
		<description><![CDATA[Når man utvikler et program starter det ofte i det små, og man programmerer med fokus på det man skal oppnå for å bli ferdig i tide. Programvare og ønsker endrer seg ofte, og det gjør også klassene og funksjonene dine. Når man gjør endringer i funksjonalitet eller legger til ny funksjonalitet er det veldig [...]]]></description>
			<content:encoded><![CDATA[<p>Når man utvikler et program starter det ofte i det små, og man programmerer med fokus på det man skal oppnå for å bli ferdig i tide. Programvare og ønsker endrer seg ofte, og det gjør også klassene og funksjonene dine. Når man gjør endringer i funksjonalitet eller legger til ny funksjonalitet er det veldig enkelt å legge til noen nye linjer i de funksjonene man allerede har; en &#8220;if&#8221; her og en &#8220;else&#8221; der kan da ikke skade?</p>
<p>Problemet oppstår først når man etter en stund skal inn og gjøre endringer i allerede eksisterende funksjonalitet, helst uten å brekke hele systemet. Kanskje man kaller på funksjoner som man egentlig ikke aner hvor finnes i kodetreet, man har ikke peiling på hvor denne globale variabelen &#8220;er_satt&#8221; ble satt, enda mindre pailing hvor den kanskje ble endret på veien, og den smarte workarounden som du la inn for et halvt år siden er nå blitt et midtpunkt i systemet ditt. Hva gjør du så? Jo, du legger til en ny &#8220;if&#8221;&#8230;</p>
<p>&#8230; eller du starter på nytt. Tanken på å starte fra scratch kan virke skremmende på de fleste, men du har et gigantisk fortrinn foran hvem som helst andre som skulle laget det samme. Du vet hva du skal lage. Du har laget det før, og du skal lage det samme på nytt, men denne gangen med modularitet i fokus.</p>
<p>Det finnes noen små og enkle leveregler når det gjelder programmering. Ingen linjer skal være lenger enn 80 tegn i bredden og ingen funksjoner skal være på flere linjer enn hva skjermbildet ditt kan vise, og gjerne litt mindre. En skummel situasjon er hvor man får løkker inni løkker inni løkker, fordi dette skaper en uorden og det er vanskelig å se på koden og umiddelbart se hva som blir gjort med dataene. Kanskje kan en av løkkene flyttes ut som en ny funksjon, som bare håndterer et sett av dataene. Kanskje denne funksjonen kan benyttes et annet sted i programmet ditt. Tankegangen bak modularitet er å få oversiktlig og gjenbrukbar kode.</p>
<p>Vær gnien på hvilke data du sender mellom funksjonene. Man kan si at dersom antall parametere inn til en funksjon overstiger tre, så gjør enten funksjonen alt for mye eller så hører disse dataene sammen og du kan kanskje lage en klasse som representerer dataene dine istedet. Husk at dataene du sender til en funksjon skal ha høy integritet, eller med andre ord &#8220;høre sammen&#8221;. Dersom du har behov for å sende data som ikke hører sammen eller som ikke er på samme nivå i systemet ditt, som for eksempel en liste med fotballag sammen med en referanse til databasekontrolleren din, da bør du vurdere å tenke nytt. Kanskje mottakerfunksjonen kan klare å finne referansen til databasekontrolleren selv, eller kanskje du kan sende lista med fotballag til en klasse som arver fra databasekontrolleren som har direkte tilgang til databasen via denne.</p>
<p>For å ta et konkret eksempel på et prosjekt jeg har jobbet med for litt siden, stod vi foran et valg hvor vi kunne lage noen funksjoner for å håndtere forskjellige filtyper og bruke if-else-kontrollstrukturer for å kalle på riktige funksjoner, eller å lage nye klasser for hver filtype og bruke en hashmap for å finne ut hvilken som skulle brukes. Vi gikk for valg nummer to. Vi lagde en felles klasse med en abstrakt metode, som alle de forkjellige filtypene arvet fra. Dermed kunne vi lage noen små og oversiktlige klasser, hvor navnet på klassene indikerte hvilken filtype de håndterte, og disse klassene arvet fra fellesklassen med forskjellige implementasjoner av den abstrakte metoden for å håndtere filtypens unike handling. Det som viste seg var at mange av disse filtypene skulle håndteres likt. Det som kunne blitt et hav av if-elsif ble nå bare en utvidelse av hashmapen for å peke alle filtypene med samme handlingsmønster til samme klasse.</p>
<p>Dette er bare et lite eksempel av hvordan man kan programmere modulært. Det er flere måter å programmere modulært på. Man kan for eksempel lage en plugin-arkitektur hvor man kan stikke inn små moduler som gjør en bestemt oppgave totalt uavhengig av de andre modulene man skulle bruke. Det man må passe på er at disse innstikksmodulene ikke blir for store og monolitiske, men at man også fører modularitetstankegangen videre ut i modulene sine og helt ut i hver funksjon.</p>
<p>Kort oppsummert handler dette om &#8220;best practices&#8221;. Innen objektorient programmering heter det at enhver klasse skal ha høy kohesjon og svak kobling. Dette gjelder også for strukturell programmering. En funksjon skal ikke kunne alt, men skal være en ekspert på sitt område.</p>
]]></content:encoded>
			<wfw:commentRss>https://hovenko.no/blog/2007/11/02/tenk-modularitet/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
