30. oktober 2002 - 16:24Der er
23 kommentarer og 1 løsning
Simple klasser til komplicerede ting
Ja, lam overskrift :-)
Jeg er ved at prøve at stykke et pakkehieraki sammen og forsøger at gøre det så simpelt som muligt, da jeg arbejder på yderst begrænset plads.
Jeg har nogle forskellige elementer/objekttyper i min problembeskrivelse, som har nogle meget ens udseender - kort fortalt har de følgende ens ting:
Kan indeholde: 0 ... 1 stykker grafik; 0 ... n stykker tekst; 1 ... n SNVT-objekter (don't ask);
Da SNVT-objekterne basalt set er Strings opbygget på forskellige måder, har jeg en interesse i nogle bestemte metoder:
hasChanged //noget i den stil; publisher/subscriber-mønster.
getHumanReadableFormatAt(index) //kommer an på SNVT-objektet og bl.a. her kommer problematikken ind i billedet.
Jeg ville gerne kunne løse problemet vha. en enkelt klasse, der kan morphes til forskellig opførsel udfra nogle udefra-kommende indstillinger, f.eks. Properties-filer, så jeg kan ændre opførsel i systemet uden at skulle rekompilere et helt program, men jeg har ikke lige fantasi/evner/kendskab til hvordan i alverden man kan gøre det.
Jeg leder ikke så meget efter "send det til mig, så laver jeg det" men mere efter "læs denne bog, kig på dette website, læs disse artikler og kig i disse eksempler". Evt. henvisninger til nogle patterns, der vil være brugbare.
Hvis dette ikke er grundigt nok beskrevet, og det er nødvendigt med noget mere specifikt i forhold til min problem-stilling, så sig endelig til :-)
Hmm ... måske ... måske ikke ... er lige ved at læse op på State, men umiddelbart tyder det på, at jeg skal implementere de forskellige opførsler, hvilket kan gå hen og give problemer i forhold til den begrænsede plads, jeg har at lege med.
Umiddelbart ser det ud til, at State kræver, at jeg på forhånd skal kende alle de tilstande/opførsler, mit program kan komme ud for/have, hvilket selvfølgelig er en god idé, men det kan jeg ikke blot gå ud fra her.
Medmindre dine krav til opførsel er meget restrictede, så de er nemme at beskrive i properties-fil/XML-config-file, så kan det være, at du skal satse på dynamisk loading.
Din standard kode læse en properties-fil/XML-config-fil, hvori optræder navnet på en klasse som loades og bruges til at udføre en bestemt ting.
Tjaa, det er forholdsvis simpel opførsel, men igen:
"Din standard kode læse en properties-fil/XML-config-fil, hvori optræder navnet på en klasse som loades og bruges til at udføre en bestemt ting."
Det har jeg næppe plads til. Jeg har umiddelbart 165 forskellige SNVT-typer (vil jeg også helst kunne behandle på samme måde som ovenstående) og nok omkring 50 forskellige elementer (dem jeg beskrev ovenfor), og 108.000 bytes til at gemme ALT relevant for programmet på. Jeg ved ikke helt, om du kan se dilemmaet i at blot loade de klasser, der skal bruges?
Nu fylder Java klasser jo ikke så meget, men jeg kan godt se problematikken.
Jeg formoder at XML også er udelukket så: de jar-filer er ret store.
Er det du leder efter mere noget i retningen af, at du indlæser en liste med ID'er og formaterings-beskrivelser, hvor du så bruger formaterings-beskrivelsen svarende til ID på, hvad nu du har ?
Lidt mere uddybende forklaring og specifikke objekter i mit problem:
Elementer:
Analog motor - har 1 stykke grafik, 1 labels, har 4 SNVT-variabler hvoraf den kun tilgår en lille del af de 3. digital motor - har 1 stykke grafik, 1 labels, har 2 SNVT-variabler som kun tilgåes delvist.
Temperatur-føler - har 1 stykke grafik, 1 label, 4 SNVT-variabler, hvoraf 1 kun tilgåes delvist; skal indeholde en historik over målte temperaturer i den sidste time Tryk-føler - magen til temperatur-føler men uden historik og kun med positive værdier.
og så fremdeles.
Nogle af dem minder meget om hinanden (f.eks. temperatur- og tryk-følere) men har alligevel forskelle i deres opførsel.
Ud over disse elementer, som jeg kender, kan der også forekomme elementer, som jeg ikke kender på forhånd.
SNVT-variabler: Div "typeangivelser" er taget fra dokumentationen på variablerne; jeg er ikke helt sikker på, den følger samme konvention som java hvad angår long.
Temperatur: 2 byte hex; signed long, præcision på 0,01°C. Efter konvertering fra hex til decimal divideres værdien med 100. Værdier fra -273,17 - +327,66; 0x7FFF == invalid data.
Tryk: 2 byte hex; signed long, præcision på 1 pa. Værdier fra -32.768 .. 32.766 Pascals. 0x7FFF == invalid data.
typedef struct { unsigned short char_set; unsigned long wide_char[15]; // 0..14 chars } SNVT_str_int; // NUL terminator
Field Definitions
Field Units Valid Range Notes char_set character set code 0 .. 255 TBD wide_char 16 bit characters 15 characters; String with zero terminator each 0 .. 65,535
Da det også her ligger i emnets natur at have ukendte typer i forhold til "lige nu", så er jeg også her interesseret i en eller anden fiks/smart/genial måde at beskrive SNVT-variabler på, hvor man så vha. f.eks. properties kan få instantieret objekter med den opførsel og opbygning, som nu er relevant.
Jeg har som sagt 108.000 bytes at gøre godt med, og med en ~komprimering på 2:1 OG brug af obfuscation kan der nok godt regnes med ~250.000 bytes ... men det er måske lidt farligt at satse på så meget "bonusplads" :-/
Jeg håber, det hjælper på forståelsen for mit problem :-)
Disky: Ja, det har jeg overvejet, og det vil være en del af løsningen - jeg mangler bare stadig den del, der indebærer, at jeg kan ændre opførsel ud fra en beskrivelse.
Hvis vi kigger på den simple del af det, så skal jeg have fundet en måde at beskrive f.eks. Tryk og Temperatur på samme måde, og derefter bruge disse parametre til at ændre et objekts væremåde.
Disky: Fulgte din idé med at gruppere data. Det giver umiddelbart følgende opbygning:
Faste ting for simple typer: Heltal: Størrelse i bytes/chars i hex-string Opløsning Min Max Signed/unsigned
Float: Størrelse i bytes/chars i hex-string Opløsning Min Max Signed/unsigned (er ikke lige sikker på denne)
Tekst: Er i og for sig blot et index; bruges til at lave et opslag i et String[] (jeg kan selvfølgelig ikke lige finde en SNVT, hvor det er tilfældet ... gah!)
Dertil kommer så de komplicerede typer/structs:
De er som regel bygget op af simple typer, som f.eks. SNVT_str_int (#37) der indeholder 1 unsigned short og 15 unsigned long variabler. Nogle af dem er dog lidt mere tricky, da de definerer deres egne simple typer, som f.eks. SNVT_chlr_status (#127), men i princippet er det jo også det samme.
Hvad jeg så lige kan bruge det til, har jeg ikke gennemskuet ... jeg har vist ikke fået nok sødemiddel tyndet op med kaffe.
Er der ikke et eller andet sted, man kan smide små billeder? Jeg er */_muligvis_/* ved at have en lille smule hul på SNVT-problematikken, men det er lidt svært at poste UML her ...
Ja, det var planen, jeg har bare ikke lige en, jeg kan bruge ... derfor mit spørgsmål. Det var måske for svært at regne ud for en veluddannet ingeniør ;-p
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.