Expand group names

Ofte har man brug for at konvertere et gruppenavn til en liste med personnavne. Dette kan nemt gøres med @ExpandNameList funktionen – men den virker kun på Mail grupper og personer der bruger Notes mail.Så her en lidt tungere variant der virker på alle gruppe og person typer:
Use "cls.system"
%REM
	Resolves a mixed list of groups and usernames - Explodes the groups and returns a list with all usernames
%END REM
Function resolveMembers( GroupOrNameList As Variant ) As Variant
	On Error GoTo eh
	Dim members As Variant
	Dim group As NotesDocument
	Dim person As NotesDocument
	Dim v As Variant

	'find a server (use the homeserver if script is running on a local database)
	Dim server As Variant
	server = Evaluate(|@if( @subset( @dbname;1 ) = ""; @LocationGetInfo([HomeServer]); @subset( @dbname;1 ))|)

	dim namelist as variant
	namelist = cList( GroupOrNameList ) 'convert to array

	ForAll member In namelist
		'find the group in names.nsf
		Set group = CacheManager.getDocument( server( 0 ) & "!!names.nsf", "($VIMGroups)", CStr( member ))
		If Not group Is Nothing Then
			v = resolveMembers( group.members )
		Else
			Set person = CacheManager.getDocument( server( 0 ) & "!!names.nsf", "($Users)", CStr( member ))
			If person Is Nothing then
				v = cList( member ) 'if not found - then just add
			Else
				v = cList( person.fullname( 0 ))
			End if
		End If

		If IsEmpty( members ) Then
			members = v
		Else
			members = ArrayAppend( members, v)
		End If
	End ForAll

	'return
	resolveMembers = ArrayUnique( members )

done:
	Exit Function
eh:
	Error Err, getErrorInfo( Me )
End Function

Bemærk: Ovenstående benytter script biblioteket cls.system som du kan finde i Developer Toolbox

Problem med db.GetProfileDocument

Nedenstående kodestump får fat i et profile dokument i basen – men hvis profil dokumentet ikke findes – så bliver det oprettet.

set profile = db.getProfileDocument( "ProfileName" )

Dette kan give problemer hvis en bruger benytter en lokal replika der ikke er replikeret færdigt. Her vil han få oprettet et nyt profile dokument – som overskriver (sletter) det oprindelige profil dokument næste gang der replikeres. Har selv stødt på dette problem et par gange.

Dermed: Inden du læser fra et profil dokumentet via Lotus Script, så er det god skik at checke om det findes. Dette kan gøres på 2 måder:

v = evaluate( |@GetProfileField( "ProfileName"; "FieldName" )| )

eller

Set coll = db.GetProfileDocCollection("ProfileName")
If coll.Count > 0 Then
   Set profile = db.GetProfileDocument("ProfileName")
End If

I script bibliotektet cls.system (som bl.a. findes i Developer Toolbox) kan du finde funktionen hasProfile( db, profilename ) – denne checker om et givent profil dokument findes i basen.

Bog: The Mythical Man Month

Bogen handler software udvikling, primært i store projekter. Bogen er skrevet af Fred Brooks på baggrund af hans erfaringer som projektleder på OS/360 udviklingen – og selvom den er 25 år gammel, så holder den stadig.

Her følger nogle af bogens konklusioner – tilsat mine egne erfaringer som Lotus Notes udvikler igennem 20 år.

 1) Dyre produkter

Som programmør kan vi hurtigt lave et program. Hvis programmet skal gøres til et produkt, så stilles der yderligere krav til input validering, test, ui, dokumentation m.v. – og så tager det 3 gange så lang tid at lave.

Ligeledes, hvis programmet skal være en komponent der kan virke sammen med andre komponenter i en større sammenhæng, så stilles der yderligere krav til interfaces, validering, optimering, test og dokumentation. Regn med at det tager 3 gange så lang tid at lave en komponent end blot et program.

Så hvis komponenten skal være et program – så tager det 9 gange længere tid at lave!

Konklusion: Lav kun produkter/komponenter hvis du skal – og ikke kan nøjes med et simpelt program

2) Dyre programmører

Én programmør kan koncentrere sig om at kode – og sikre et konsistent interface. Alt bliver bygget på den samme ide og bliver struktureret ens. Dette er den mest optimale og billigste måde at programmere på.

Hvis der er 2 eller flere programmører på samme projekt – så kommer der automatisk et overhead i form af møder, flere test, mere dokumentation tidligt i projektet m.v. Jo flere programmører jo større bliver dette overhead. Projektet bliver samlet set dyrere – men bliver også hurtigere færdigt (med mindre at der er alt for mange programmører – så kan det ende med at så stort overhead at deadline bliver rykket)

En løsningsmodel kunne være at etablere et ‘Surgial Team’. Her er rollerne fordelt og der benyttes kun én programmør. Resten får støtte funktioner, f.eks. Tool Maker, Debugger, Edtior, Tester etc.

Konklusion: Minimér antallet af programmører på et projekt

3) Dyre linier

Hvis det tager 1 timer at skrive 10 linier kode, inkl test, dokumentation og debug – kan man så lave 100 liner på 10 timer? Nej – erfaringer viser at det tager længere tid. Kurven er eksponentiel.

Konklusion: Skriv ikke flere linier kode end nødvendigt for at løse opgaven

4) Genbrugelig kode

Kode skal genbruges – det sparer tid og giver færre fejl! Men hvis andre skal genbruge din kode – så skal det laves både som et komponent og tager dermed 3 gange længere tid at lave (jvnf punkt 1). Og hvis dokumentationen og tilgængelig ikke er i orden – eller hvis interfacet ikke er intuitivt, så er der en risiko for at koden ikke bliver genbrugt alligevel…

Konklusion: Hvis din kode skal genbruges af andre, så skriv små simple, intuitive komponenter og lav udførlig dokumentation

Citat fra bogen:

”Reuse it something that is far easier to say than to do. Doing it requires good design and very good documentation”

 5) Keep It Simple

Så kort kan det opsumeres: “Keep it Simple”. Her et par citater:

  • Simplicity is the ultimate sophistication, —Leonardo Da Vinci
  • Complexity kills. It sucks the life out of developers, it makes products difficult to plan, build and test, it introduces security challenges and it causes end-user and administrator frustration, —Ray Ozzie
  • Bad programmers worry about the code. Good programmers worry about data structures and their relationships, Linus Torvalds
  • Den nemme løsning er aldrig den rigtige, Jakob Majkilde
  • Hvis koden er kompleks – så start forfra, Jakob Majkilde

Links