Avatar billede chrisrj Forsker
15. januar 2014 - 13:07 Der er 41 kommentarer og
1 løsning

At lave et "Bill of Materials" objekt

Hejsa

I næste skridt i følgetonen om min bysamfundssimulator, prøver jeg nu at finde en smart måde, at holde styr på hvilke materialer og mængder af disse jeg skal bruge.


Eksempel:

Jeg skal bygge et hus. Dette hus består af 3 bygningselementer(fundament, bærende konstruktion og forskalling).
Hvert element har nogle dimensioner og et eller flere materialer.


Så langt så godt.


Nu kunne jeg så godt tænke mig, at lave en samlet liste over de materialer(og mængder) jeg skal bruge til hele bygningen.

Det skal dertil siges, at jeg også har en lignende struktur for at lave værktøjer. Her er elementerne bare Håndtag, Forlænger og Redskabsdel.

Som en lille krølle på problemet, er det IKKE givet, at er altid er 3 elementer - nogle gange kan der godt bare være 2. Det gælder både bygninger og værktøjer.

Materialerne er pt. delt op som dels klasser, dels nogle enums(ja, jeg er tosset med dem! ;D).

Eksempel:

Jeg har klassen Plant som har subklasserne Tree og Seed.
Dertil har jeg så en Enum WoodType som indeholder træsorterne

Min Forester bruger så et Seed til at plante et Tree.

Træet vokser sig stort, og min WoodChopper kommer så og fælder det, og laver det til Boards.


Nu har jeg så et klart byggemateriale.


Jeg har så lavet mig en klasse BillOfSingleMaterial som jeg laver mig en liste af:

public class BillOfSingleMaterial
    {
        private string _ElementName;
        private string _MaterialType;
        private string _MaterialSubType;
        private double _Amount;


        public BillOfSingleMaterial() {
            _ElementName = "";
            _MaterialType = "";
            _MaterialSubType = "";
            _Amount = 0;
        }

        public BillOfSingleMaterial(string ElementName, string MaterialType, string MaterialSubType, double Amount)
        {
            this._ElementName = ElementName;
            this._MaterialType = MaterialType;
            this._MaterialSubType = MaterialSubType;
            this._Amount = Amount;
        }
    }

Men jeg er ikke rigtigt glad for at bruge strings til at identificere mine elementer og meterialer, som jo er objekter. :-/

Hvad gør en klog?
Avatar billede Syska Mester
15. januar 2014 - 13:52 #1
En ting der skal bygges må have en "GetRequierements()" ... så ved du hvad du skal bruge ...

De Requierements må have en eller anden fælles Class/Interface ...

Så er det jo bare at have en BillOfMeterials class som tager det fælles Class/Interface ...

Jeg kan ikke lige helt se problemet her ...
Avatar billede Syska Mester
15. januar 2014 - 13:54 #2
Der er selvfølgelig grund materierler som kommer ud af ingenting eller kan graves op af jorden.

Reelt er alt jo et Meteriale ... selv jord.

Frø -> Træ -> Planke -> Træhus

Alt i min verden ville være det samme. Da de jo skal have nogen fælles træk for at gøre det hele lidt nemmere.
Avatar billede chrisrj Forsker
15. januar 2014 - 14:08 #3
"En ting der skal bygges må have en "GetRequierements()" ..."

Hmm...joh...men det ved jeg faktisk heller ikke - der er ikke noget fast at forholde sig til. En bygning kan jo laves af..jah, alt. :) Selv Jord. ;)


"Jeg kan ikke lige helt se problemet her"

Nej, men så er det nok fordi du er bedre end mig. ;)


"Alt i min verden ville være det samme. Da de jo skal have nogen fælles træk for at gøre det hele lidt nemmere."
Det er jeg så ikke heelt enig i. ;)
Frø og træer er jo planter og dermed levende. De to andre er jo pænt døde. ;)
Avatar billede Syska Mester
15. januar 2014 - 14:19 #4
Enig, men de har stadig ting til fælles ... de bliver brugt til at  bygge andre ting med.

Du kan jo have en
IMaterial

ILivingMaterial : IMaterial

IDeadMaterial : IMaterial

Nu har du både for dødt og levende.

Men du kan behandle alle dine ting på samme måde når du skal regne på dem. Da alt er af IMaterial.

Jeg tror i hvert fald godt det vil kunne lade sig gøre ...

Håber du kan se ideen
Avatar billede chrisrj Forsker
15. januar 2014 - 14:49 #5
"Enig, men de har stadig ting til fælles ... de bliver brugt til at  bygge andre ting med."

Mjarh, det mener jeg ikke helt passer. Godt nok bruges et frø til at plante et træ. Men et træ bruges jo ikke til at lave træstammer MED, men AF. ;)

Min datastruktur ser pt. således ud:
For levende:
Organism->Nature->Plant->Tree
Organism->Nature->Plant->Seed

For døde:
RawGoods->Wood->Logs
ProcessedGoods->Boards

Interface er ikke rigtigt noget jeg har prøvet før - kunne du give et eksempel på, hvordan du mener det kunne se ud?
Avatar billede Syska Mester
15. januar 2014 - 15:09 #6
Interface/Abstract base class ..

Ved Arne_v har skrevet om det før. Der er ikke den store forskel kun at abstract kan have en default implementering og interface skal du altid implementere det hele i den konkrete klasse.

For at plante et træ skal du bruge et frø.
For at lave en stamme skal du bruge et træ.
For at bygge et hus skal du bruge XXX.

Sætningerne synes jeg nu passer meget godt sammen.

Men om det hedder A eller B er vel som sådan lige meget bare det bliver perfekt i en udviklers øjne hvor det giver god mening.

Men uden at kende hele dit projekt tror jeg det bliver svært at bliver mere konkret, eller beskrive ting som allerede er blevet skrevet i tidligere spørgsmål.

Men du kan jo også godt have 2 forskellige ting.

Døde og levende ting.

Men til sement, skal du jo bruges vand(levende) og mørtel(dødt) som så må give et output af en død ting.

Hvor frø og vand vil kunne give mange levende ting ... og her kommer så endnu et problem at noget er levende bliver til en død ting.

Jeg kan ikke lige gennemskue hvordan det hele kommer til at virke hvis du ikke kan behandle alle dine ting på samme måde.
Avatar billede chrisrj Forsker
15. januar 2014 - 15:35 #7
...for at bygge et hus, skal jeg A) have en byggeplan, B) som har nogle bygningelementer og C) som er af nogle forskellige materialer.
Altså, JEG synes ikke det er det samme... :)


Det kan godt være jeg er lidt(meget?) dårlig til at beskrive mine problemer ordenligt, så jeg prøver lige igen:

Helt konkret har jeg flere forskellige objekter jeg skal samle uden på forhånd at vide hvilken type de er.

Det kunne eksempelvis være et bygningselement som har et materiale, brædder, som er af træsorten eg.

Bygningselementet har jeg her:
public BuildingElement(BuildingElementType type, BasicMaterialType materialtype, int height, int length, int width, Strength strength) {...}

Brædderne har jeg - med træsort som en enum property:
public Boards(int amount, LifeLength lifespan, bool israwmaterial, int quality, WoodType woodspecies) {...}

"BasicMaterialType materialtype" i BuildingElement skal så udskiftes med noget "Bill of Materials".

Den BoM skal så kunne indeholde brædder, men også alle mulige andre typer.

Giver det mere mening nu, eller er det bare mig der er fat svag? :)
Avatar billede Syska Mester
15. januar 2014 - 16:47 #8
Det giver fin mening, men som du selv slutter af med:

Den BoM skal så kunne indeholde brædder, men også alle mulige andre typer.

"men også alle mulige andre typer."

Eneste måde at kunne håndtere alle typer på er via et eller andet som er fælles.

Lige nu har du intet som er fælles for alle dine ting og kan derfor ikke lave det.

Man kan som du tidligere har gjort lave en stor swtich/case for at finde ud af hvad type det er og så håndtere dem forskelligt. Man tager så bare imod en liste aftype "object".

Men du kan jo lave din BoM så den har en metode for hvert eneste ting den skal kunne tage imod.

Men hvis du tænker på dine objecter ... hvad er så fælles for alle i din BoM? Der må være et eller andet de har til fælles for at kunne lave en retning.

IBill interface hvor ting skal implementere en speciel property som kunne være pris.
Avatar billede chrisrj Forsker
15. januar 2014 - 17:01 #9
Hmmm...

Lige nu er roden hhv. RawGoods og ProcessedGoods.

Jeg kunne da godt lave en fælles rod ved navn...Goods! :D

Tror du det kunne virke?
Avatar billede Syska Mester
15. januar 2014 - 17:28 #10
Siden en pris ikke afhænger af om det er Raw eller Processed så vil det i min verden virker.

Prisen afhænger jo af selve objektets stand, størrelse etc.

Det er jeg helt sikker på vil virke.
Avatar billede chrisrj Forsker
15. januar 2014 - 17:46 #11
Godt, så mangler jeg bare at finde ud af, hvordan jeg får klasse navnene og enum navnene ind BoM objektet.

Hmmm...nogen gode ideer? :)
Avatar billede Syska Mester
16. januar 2014 - 22:30 #12
Spørgsmålet ikke forstået.
Avatar billede chrisrj Forsker
16. januar 2014 - 23:36 #13
Ok. Mit Bom objekt skal indeholde følgende:

Element navn (dvs. navnet på (ConstructableObject's sub-klasserne)klassen)
Materiale navn (dvs. navnet på (Goods/sub-klasserne)klassen)
Materiale type (dvs. værdien af den tilhørende enum )
Material mængde (bare et tal(double))

UDEN at jeg skal lave 1000(een pr. klasse) interfaces eller lign. ;)

Er det helt umuligt?
Avatar billede Syska Mester
16. januar 2014 - 23:51 #14
Læs det fra en DataSource og lav dine objecter ud fra den viden.

Er BOM ikke "billing of materials" ... hvorfor er det du vil lave 1000 af dem?
Avatar billede chrisrj Forsker
17. januar 2014 - 00:36 #15
DataSource? Er det ikke kun til database brug? Det påtænker jeg ikke at lave endnu.

Nej, BoM er "Bill of materials", og ikke BillING. ;) Det er KUN en liste over materialer og mængder, der er ikke noget med pris ind over.

Det kan godt være jeg har misforstået dig, men jeg kommer til at have omkring 1000 materiale klasser, og jeg forstod det som om du mente, jeg skulle implementere BoM interfaces i dem alle - eller var det omvendt?? :D
Avatar billede Syska Mester
17. januar 2014 - 10:16 #16
Jeg er helt lost ... jeg har for lidt kontekst til at kunne udtale mig om det.

Men nu kommer jeg til at tænke på hvad Arne_v skrev i en anden post.

For hver type ... Wood, Water, Sand, Plank ... ville jeg har en .NET klasse.

Hvis properties kan være forskellige ville jeg har det som properties som jeg læser ud af en xml fil eller anden datasource.
Avatar billede chrisrj Forsker
17. januar 2014 - 11:08 #17
Heh, det kan jeg godt forstå - jeg roder vidst lidt meget rundt her. :-/

Jeg har uploaded mit klassediagram, måske det kan hjælpe lidt? http://s22.postimg.org/y6z6skvlt/cd_Class_Test.png

Som det ses, har jeg de forskellige materialer nede i højre hjørne. Og ja, det er een klasse pr. overordnede type.

Men jeg har ikke klasser for f.eks. OakBoards, PineBoards osv.

Er jeg virkelig nødt til at pinde det SÅ meget ud, før jeg kan arbejde med det? :(

Arg, jeg får ticks af XML! :D Det bliver ikke noget jeg kommer til at bruge. ;)

Ok, så en datasource behøver altså IKKE at være en database...rart at vide. :)
Avatar billede chrisrj Forsker
21. januar 2014 - 22:31 #18
Nå, hjalp det ikke på klarheden? :)
Avatar billede Syska Mester
21. januar 2014 - 23:46 #19
Udover opløsningen er så ringe på det billede at jeg knap kan læse det så er jeg ikke blevet meget klogere.

DataSource er bare et sted der kan komme data fra ...

Ved ikke rigtig om jeg er blevet meget klogere ... jeg er stadig lidt i tvivl om hvad dit mål er.

Det jeg læser fra dit oprindelig spørgsmål er linjen:
Nu kunne jeg så godt tænke mig, at lave en samlet liste over de materialer(og mængder) jeg skal bruge til hele bygningen.

Er det ikke bygningen der ved hvad den er lavet af? Burde den ikke indeholde de informationer?
Avatar billede chrisrj Forsker
22. januar 2014 - 00:17 #20
Hm, nej, det er da også rigtigt. :-/

Her kan du i hvert fald se det: http://postimg.org/image/p741lo65x/full/
Ellers skal du sgu ha' briller! ;p

Jeps, jeg er med på datasource nu. :)


Korretk, bygningen ved ikke hvad den lavet af, da bygningen faktisk ikke eksistere som en enhed. :)

Den består, som nævnt, af 3 bygningselementer som hver især består af nogle materialer <- det er disse materialer jeg gerne vil have en samlet liste over.
Avatar billede Syska Mester
22. januar 2014 - 00:40 #21
Men et eller andet skal jo kende til hvad en bygning er lavet af ...  det kommer vel ikke magisk ud af luften :-)

Men det kan vi jo starte med at få styr på ...
Avatar billede chrisrj Forsker
22. januar 2014 - 01:02 #22
Hehe. ;)

Altså, jeg forstiller mig, at jeg kan lave et kald til bygningsobjektet's BillOfMaterials og dermed se hvad der skal bruges...så BoM objektet skal vel bruges i den klasse.

Måske, det hele giver meget mere mening, hvis jeg skitsere forskellen mellem et normalt bygnings objekt i spil:

Normalt:
Du vælger bygning, som så "smides" ind på kortet - og bygningen anses for at eet objekt - hvis det er HEELT vildt, kan man se en animation af byggeprocessen i flere faser.

I min sim:
Der bygges hvert element hver for sig, og sameksistere i hele bygningens levetid. Også selvom et eller flere af elementerne fjernes(taget f.eks.).
Det betyder bla. at du kan fjerne en væg fra en bygning og montere den samme væg på en anden.


Kort sagt: I min sim ser man verdenen fra håndværkersjakkets side, hvorimod man normalt ser det fra arkitektens side. :)
Avatar billede Syska Mester
22. januar 2014 - 09:32 #23
BillOfMaterials == Regning for Materialer
Er det ikke et forkert navn?

var building = new SmallBuilding();
var req = builder.GetRequirements(); // Som returnere en liste af det interface vi snakkede om tidligere ...

"req" er en liste af de ting som skal bruges til huset.

Du kan måske også returnere et object som har 3 lister på sig. Hvis du mener alle de materialer adskiller sig så meget.

mvh
Avatar billede chrisrj Forsker
22. januar 2014 - 10:38 #24
Bill betyder ikke nødvendigvis en regning: http://en.wikipedia.org/wiki/Bill_of_materials :)

Øhm...builder.GetRequirements(); ? Mener du ikke building.GetRequirements(); ??

Yes, lige det jeg gerne vil have. :)

Nej, det vil være samme typer af materialer, hvis de hedder det samme - ellers må der jo bare være flere på listen. ;)
Avatar billede Syska Mester
22. januar 2014 - 10:49 #25
Ohhh, men det var sq da et tosset navn. De er ikke rigtig kloge :-)

Jow jow ... multitasking går vist ikke så godt fra morgenen.
Avatar billede chrisrj Forsker
22. januar 2014 - 12:12 #26
Der er faktisk mange slags bills: http://en.wikipedia.org/wiki/Bill :)

Jeg tror snarer, at danskere misforstår ordet. ;)

At jeg så bruger Bill of Materials forkert, og burde bruge Bill of Quantities, er noget HELT andet! ;D


Godt, så er jeg (lidt) med igen. :)

Jeg har opdateret klasse diagrammet: http://postimg.org/image/srzx4waph/full/

Vil du så mener, at det dersens interface-ting skulle forbinde til(==have en liste af) Goods klassen? :)
Og derefter bruges af ConstructableObjects klassens underklasser?

Eller hwa'? :D
Avatar billede Syska Mester
22. januar 2014 - 12:42 #27
Hvis du læser dem begge er der faktisk forskel som de skriver det på siden.

Så BOM er nok det rigtige ... da MOQ bliver beskrevet som den mængde det kræver at bygge et "proposed construction" ... og så igen ... dette kan jo også være en foreslået konstruktion.

Ja, more or less ...
Avatar billede chrisrj Forsker
22. januar 2014 - 12:52 #28
Godt så. :)

Det bliver heller ikke anderledes, for jeg har besluttet(!!) at det skal hedde BoM. Og sådan er det bare! ;)


Lol, "more or less"!? :D

Betyder det, at du ikke orker at uddybe det nærmere? :)
Avatar billede Syska Mester
22. januar 2014 - 13:03 #29
Nej, mere at jeg håber vi er enige ...

Jeg tror i hvert fald sådan lige nu at det var sådan jeg ville starte ... så man kan jo altid senere lave det om hvis man finder ud af det er en mærkelig/dum/træls måde at lave det på.

Men ... de bliver i hvert fald nød til at kunne håndteres på samme måde ... da tingen der skal bygges er ret ligeglad med det er lavet af, men bare at det skal laves af X ting som jo på BOM bare er en linje.

Get it on ... less talk, more doing ... :-)
Avatar billede chrisrj Forsker
22. januar 2014 - 13:06 #30
Hehe, okay så. :p

Jeg kigger på en implementering, når jeg får tiden til det - måske i aften. ;)
Avatar billede chrisrj Forsker
22. januar 2014 - 20:09 #31
Arg, jeg fatter det altså ikke! :((

Jeg kan ikke se, hvor, hvordan og med hvad jeg skulle implementere et interface.


Jeg har så i stedet forsøgt at bruge den klasse(BillOfSingleMaterial), jeg skrev i spørgsmålet.


I klassen Building har jeg lavet denne linie:

public List<BillOfSingleMaterial> _BillOfMaterials;


og implmenteret den i min(e) constructor(s):

this._BillOfMaterials = new List<BillOfSingleMaterial>();

this._Foundation = new Foundation(materialtype, height / 10, length, width, Strength.Medium);

this._BillOfMaterials.Add(new BillOfSingleMaterial(this._Foundation.ElementType.ToString(), this._Foundation.MaterialType.ToString(), "", this._Foundation.TotalConstructableAmount, 0));

this._StructualFrame = new StructualFrame(materialtype, height, length, width, Strength.Medium);

this._BillOfMaterials.Add(new BillOfSingleMaterial(this._StructualFrame.ElementType.ToString(), this._StructualFrame.MaterialType.ToString(), "", this._StructualFrame.TotalConstructableAmount, 0));

this._Formwork = new Formwork(materialtype, height, length, width, Strength.Medium);

this._BillOfMaterials.Add(new BillOfSingleMaterial(this._Formwork.ElementType.ToString(), this._Formwork.MaterialType.ToString(), "", this._Formwork.TotalConstructableAmount, 0));


Men den får ikke TotalConstructableAmount med!?

Er jeg heelt galt på den, eller hvad sker der?
Avatar billede chrisrj Forsker
23. januar 2014 - 16:03 #32
Nå, der var vidst en fejl i min property...pinligt... :p
Avatar billede chrisrj Forsker
23. januar 2014 - 23:20 #33
Ok, nu har jeg fået mit BoM til at virke. :)

Det blev langt fra perfekt, men det må jeg nok bare leve med i denne omgang.

Smider du et svar? :)
Avatar billede Syska Mester
23. januar 2014 - 23:30 #34
svar.

Lige et par kommentarer.

Jeg får knupper af alle dine this. Det er helt tydeligt at der arbejdes på et object på klassen da du har navngivet den med "_" ... dvs private/protected member field. Så fjern "this", det er bare ren støj.

Udover det så synes jeg du har frygteligt mange strings i spil der ... kan ikke lige helt gennemskue det, men var du ikke på vej mod noget type stærkt?
Avatar billede Syska Mester
23. januar 2014 - 23:31 #35
svar
Avatar billede chrisrj Forsker
23. januar 2014 - 23:50 #36
For mig betyder "_" ikke et bare et objekt, men et internt(private) navn(om det så er en variabel, eller et objekt).

Jeg kan godt følge dig så langt, at det virker overflødigt, at bruge this, men jeg gør det for at holde konsistens og være sikker på, at koden gøre som jeg tror den gør. :)
Det kan godt være lidt svært at holde styr på, når det hele ændre sig så meget.

Og jo, der er ALT ALT for mange strings. :( Men det håber jeg at ændre inden ikke alt for længe. Præcist hvordan har jeg dog ikke fundet ud af endnu.

Jeg takker og bukker for hjælpen - og ikke mindst tålmodigheden! ;D
Avatar billede Syska Mester
24. januar 2014 - 00:25 #37
parameter er "myString" ... ligesom interne variabler oprettet i en metode.
member field variable er "_myString" ( Kan også være _MyString, gør ikke den store forskel )
properties er "MyString"
const variable er "MY_STRING"

Det er MS der har de guide lines et eller andet sted på deres side.

På denne måde er man aldrig i tvivl om hvor meget kommer fra ved at kigge på dens navn.

En metode bør ikke fylde mere end den kan være på en skærm, fylder den mere kan det være et tegn på de bør smide ud i methods.
Avatar billede chrisrj Forsker
24. januar 2014 - 00:37 #38
Jo, tak.

...nogle gange har man nok en tendens til at lave sine egne regler - især, når man ikke skal dele koden med andre. ;)
Avatar billede Syska Mester
24. januar 2014 - 00:52 #39
Problemet med den regel er at du allerede ved at poste kode her har brudt den :-)
Avatar billede chrisrj Forsker
24. januar 2014 - 00:59 #40
Hehe, TI STILLE!! :D

Ej, jeg VED det...og er ved at fixe det - bliver du så glad? ;p
Avatar billede Syska Mester
24. januar 2014 - 01:24 #41
altid altid
Avatar billede chrisrj Forsker
24. januar 2014 - 01:34 #42
Hehe...er dette bedre:

public BillOfSingleMaterial(string elementName, string materialType, string materialSubType, double amountNeeded, double amountReserved)
{
    this._ElementName = elementName;
    this._MaterialType = materialType;
    this._MaterialSubType = materialSubType;
    this.Amountneeded = amountNeeded;
    this.AmountReserved = amountReserved;
}


Og NARJ, du får mig IKKE til at fjerne this'erne!! ;p
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester