Hej Emily!
Låter som ett kul problem! Vi har kört kata de två senaste gångerna,
så nästa möte sitter vi nog bara och snackar. Därefter vore det kul
att sätta tänderna i farbror Bobs kod!
/ CJ
emilybache wrote:
> Hej,
>
> Tack för uppmuntran att jag har förstått Bobs kod :-)
>
> Jag tittade lite på din lösning på http://github.com/crzivn/rubyargs.
> Det är alltid modig att lägga ut kod man har skrivit, för då får man
> feedback på den ;-)
>
> Jag tycker om ganska mycket av vad du har gjort. Till exempel jag
> tycker att din dictionary mapping är lika tydlig som Bobs
> metaprogrammering, och enklare.
>
> parser.expect('l' => :boolean, 'p' => :number, 'd' => :string, 'g'
> => :list)
>
> Jag tycker också om att du dela upp ARGV strängen till options med en
> regexp.
>
> def parse(input)
> # join option flags with their values (for easier regexp matching
> later):
> # ["-a", "123", "-b", "abc", "-c", "-d", "1", "2", "-3", "4"] =>
> # ["-a 123", "-b abc", "-c", "-d 1 2 -3 4"]
> input = input.join(' ')
> options = []
> while i = input.rindex(/-[^\d+]/) do
> options << input.slice!(i..-1).strip
> end
När man gör kodkatas, är det förbjudet att använda (std)libs/gems?
getopts och optparse (plus att det finns fler) skulle ju annars lämpa
sig här.
> Jag också var inne på en sån lösning med string.split("-"), men
> övergav den när jag upptäckt att jag inte enkelt kunde skilja mellan
> en flag och en negativ integer. Jag borde verkligen har tänkte då
> "regexp" men det är kanske skillnaden mellan en python programmerare
> och en ruby programmerare :-) Jag är dock lite osäker om det verkligen
> kommer att funka i alla möjliga lägen. Kunde man inte få en regexp
> match på fel sak ibland?
>
> Det finns aspekter av din design som jag tycker mindre om, dock.
>
> case filter
> when Symbol: value.send(filter)
> when Proc: filter.call(value)
> else value
> end
>
> det känns inte bra att ha en switch statement som behöver skilja
> mellan en symbol och en function. Jag tycker man borde kunna fixa det
> här utan.
Kan du förklara varför det inte känns bra? Vad skulle du använt
istället, if-then-elseif-else?
> Jag tycker också att du behöver tänka lite på vad som behövs för att
> lägga till en ny typ. Just nu behöver man ändra i Args klassen, och
> lägga till något mer i OPTIONS tror jag. Det gör din design mindre
> tålig för förändring. Fördelen med Bobs är att man kan lägga till nya
> typer utan att ändra i befintlig kod. Det är vad menas med "Open
> Closed Principle" dina klasser ska vara "open for extension but closed
> for modification".
"Open Closed Principle" är intressant, aldrig hörttalas om tidigare.
> Tack för att du tog tiden att göra katan och även dela med dig av din
> kod!
>
> Vi ska tackla denna katan på måndag på våran GothPy möte, så
> förhoppningsvis kommer det lite python kod ut på github efter det, och
> ni är välkomna att granska och kriticera det med!
>
> Mvh
> Emily
MVH
- Simon
> Med case-statementet som jag inte gillar, jag borde varit mer
> specifikt, tack för att du poangtera det. Det luktar för mig som om
> man hade kunnat använder sig av polymorphism istället. (page 299 i
> "clean code", "Prefer polymorphism to If/Else or Switch/Case")
Switch/Case är djävulens verktyg... :)
/Jörgen
Mja, jag önskar jag hade tiden och kunskapen (och intresset ; ) Jag är
ju trots allt bara hobbyprogrammerare, sysadm till jobbet). Annat stjäl
min tid.
> Med case-statementet som jag inte gillar, jag borde varit mer
> specifikt, tack för att du poangtera det. Det luktar för mig som om
> man hade kunnat använder sig av polymorphism istället. (page 299 i
> "clean code", "Prefer polymorphism to If/Else or Switch/Case") Då
> kanske det hade varit lättare att lägga till nya typer i framtiden,
> och uppfylla "open closed principle".
Åhå, bad att få det förklarat för mig av en kompis som är utvecklare, nu
förstår jag vad du menade.
Trevlig helg!
MVH
- Simon
Det finns aspekter av din design som jag tycker mindre om, dock.
case filter
when Symbol: value.send(filter)
when Proc: filter.call(value)
else value
end
det känns inte bra att ha en switch statement som behöver skilja
mellan en symbol och en function. Jag tycker man borde kunna fixa det
här utan.
Jag tycker också att du behöver tänka lite på vad som behövs för att
lägga till en ny typ. Just nu behöver man ändra i Args klassen, och
lägga till något mer i OPTIONS tror jag. Det gör din design mindre
tålig för förändring. Fördelen med Bobs är att man kan lägga till nya
typer utan att ändra i befintlig kod. Det är vad menas med "Open
Closed Principle" dina klasser ska vara "open for extension but closed
for modification".
Tack för att du tog tiden att göra katan och även dela med dig av din
kod!
Vi ska tackla denna katan på måndag på våran GothPy möte, så
förhoppningsvis kommer det lite python kod ut på github efter det, och
ni är välkomna att granska och kriticera det med!