[Övning] för objektorienterad kod

Permalänk
Avstängd

[Övning] för objektorienterad kod

Läste en bra övning i att lära sig skriva bättre objektorienterad kod.

http://binstock.blogspot.com/2008/04/perfecting-oos-small-cla...

Övningen går ut på att skriva ett program på 1000 rader med följande restriktioner.

Citat:

1. Use only one level of indentation per method. If you need more than one level, you need to create a second method and call it from the first. This is one of the most important constraints in the exercise.

2. Don’t use the ‘else’ keyword. Test for a condition with an if-statement and exit the routine if it’s not met. This prevents if-else chaining; and every routine does just one thing. You’re getting the idea.

3. Wrap all primitives and strings. This directly addresses “primitive obsession.” If you want to use an integer, you first have to create a class (even an inner class) to identify it’s true role. So zip codes are an object not an integer, for example. This makes for far clearer and more testable code.

4. Use only one dot per line. This step prevents you from reaching deeply into other objects to get at fields or methods, and thereby conceptually breaking encapsulation.

5. Don’t abbreviate names. This constraint avoids the procedural verbosity that is created by certain forms of redundancy—if you have to type the full name of a method or variable, you’re likely to spend more time thinking about its name. And you’ll avoid having objects called Order with methods entitled shipOrder(). Instead, your code will have more calls such as Order.ship().

6. Keep entities small. This means no more than 50 lines per class and no more than 10 classes per package. The 50 lines per class constraint is crucial. Not only does it force concision and keep classes focused, but it means most classes can fit on a single screen in any editor/IDE.

7. Don’t use any classes with more than two instance variables. This is perhaps the hardest constraint. Bay’s point is that with more than two instance variables, there is almost certainly a reason to subgroup some variables into a separate class.

8. Use first-class collections. In other words, any class that contains a collection should contain no other member variables. The idea is an extension of primitive obsession. If you need a class that’s a subsumes the collection, then write it that way.

9. Don’t use setters, getters, or properties. This is a radical approach to enforcing encapsulation. It also requires implementation of dependency injection approaches and adherence to the maxim “tell, don’t ask.”

Taken together, these rules impose a restrictive encapsulation on developers and force thinking along OO lines. I assert than anyone writing a 1000-line project without violating these rules will rapidly become much better at OO. They can then, if they want, relax the restrictions somewhat. But as Bay points out, there’s no reason to do so. His team has just finished a 100,000-line project within these strictures.

Visa signatur

Programmerare med C++ som huvudspråk.

Permalänk
Hedersmedlem

Hmm, hur ska man göra #9 om man inte får använda getters/setters? Missar jag något stort här, eller menar han att det är "mera OO" att komma åt variablerna direkt?

Visa signatur

Asus ROG STRIX B550-F / Ryzen 5800X3D / 48 GB 3200 MHz CL14 / Asus TUF 3080 OC / WD SN850 1 TB, Kingston NV1 2 TB + NAS / Corsair RM650x V3 / Acer XB271HU (1440p165) / LG C1 55"
Mobil: Moto G200

Permalänk

Har någon ett exempel på något man skulle kunna göra för att testa detta?

(Dvs vafan ska man koda för något?!)

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av Thomas
Hmm, hur ska man göra #9 om man inte får använda getters/setters? Missar jag något stort här, eller menar han att det är "mera OO" att komma åt variablerna direkt?

Nej, meningen är inte att komma åt variablerna direkt, utan motsatsen. Ett enkelt exempel vore att man har en boll-klass. Använder man getters/setters så skulle man t.ex. kunna ha SetX och SetY för att flytta den. Tanken här är nog istället att man ska ha en metod som t.ex. Move. Dvs. man manipulerar inte bollens koordinater, utan man säger till bollen att flytta på sig. Man ska inte tänka på vilka medlemsvariabler som en klass har, utan vad det är meningen att den ska göra.

@hagbarddenstore: Det går att koda precis vad man vill. Det är inget speciellt med restriktionerna som listas här, utan det är bara vanlig OO-programmering (även om restriktionerna är ganska extrema).

Permalänk
Citat:

Ursprungligen inskrivet av perost

@hagbarddenstore: Det går att koda precis vad man vill. Det är inget speciellt med restriktionerna som listas här, utan det är bara vanlig OO-programmering (även om restriktionerna är ganska extrema).

Det var inte frågan. Jag frågade om någon hade en idé på VAD man kan koda...
Dvs, jag har inte den blekaste aning om vad jag ska koda.

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av hagbarddenstore
Det var inte frågan. Jag frågade om någon hade en idé på VAD man kan koda...
Dvs, jag har inte den blekaste aning om vad jag ska koda.

Pong? Så får du se hur överdrivet komplicerat en fundamentalistisk strategi som ovanstående gör saker och ting.

Permalänk
Avstängd
Citat:

Ursprungligen inskrivet av hagbarddenstore
Det var inte frågan. Jag frågade om någon hade en idé på VAD man kan koda...
Dvs, jag har inte den blekaste aning om vad jag ska koda.

Skriv någon parser

Visa signatur

Programmerare med C++ som huvudspråk.

Permalänk
Medlem

Men vad du än lyckas att koda i Java blir ju OO så jag fattar inte vitsen med övningen.

"Mer OO?" vad är "mer" OO?

Visa signatur
Permalänk
Medlem

Säg att du skapar ett program i C++ där hela programmet ligger i int main och går funktionellt genom hela processen, kallar du det OO då? bara för att C++ är ett OO-språk?

Permalänk
Avstängd
Citat:

Ursprungligen inskrivet av wizzler
Men vad du än lyckas att koda i Java blir ju OO så jag fattar inte vitsen med övningen.

Det kanske är så att du inte förstått vad OO är?

Det går ju och kraftigt missbruka funktionalitet som finns i språk för att fått bättre struktur m.m. OO i sig är inget självändamål heller, ibland passar annat eller en blandning.

Enligt mig (många har sin egen tolkning vad OO innebär) så handlar det i första hand om att man bygger funktionalitet kring datamängder som har specifika uppgifter.

Objektorienterade språk har "hjälpmedel" i språken, en syntax som underlättar själva kodningen men det är absolut inget krav. Det går utmärkt och skriva objektorienterad kod i de flesta språk.

Angående övningen så verkar den enligt mig vara väldigt bra för att lära sig strukturera upp objektorienterat. Däremot så anser jag att det blir på tok för objektorienterat om man skulle skriva ett helt program så.
Vanligen när man skriver applikationer och annat så brukar man ha viss kod som är unik för applikationen, men även generell kod som man kan använda lite var som helst.

Generell kod passar mycket bra för att skriva objektorienterat, däremot kan det krångla till en del om man skriver unik kod för applikation för objektorienterat. Det är en typ av kod som man ofta får rätta buggar i, kod som man inte är lika van vid o.s.v. En nackdel med objektorienterad kod är att den vanligen är mycket svårare och debugga. Det rö svårare och hänga med.

Visa signatur

Programmerare med C++ som huvudspråk.

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av CruS
Säg att du skapar ett program i C++ där hela programmet ligger i int main och går funktionellt genom hela processen, kallar du det OO då? bara för att C++ är ett OO-språk?

1) Ordet du söker är "imperativt". Funktionell programmering är väsensskild.
2) C++ är ett flerparadigm-språk, och långt ifrån strikt objektorienterat. Java är inte heller strikt objektorienterat - framför allt beroende på att de saknar första klassens funktioner/funktioner som objekt (något C och C++ efterliknar med funktionspekare, och C# med delegater), samt att de målade in sig i ett hörn tidigt när de beslöt sig för att ha med primitiva datatyper (int, double, boolean).

Permalänk
Avstängd
Citat:

Ursprungligen inskrivet av badboll
samt att de målade in sig i ett hörn tidigt när de beslöt sig för att ha med primitiva datatyper (int, double, boolean).

Que?
C++ är designat för att få bästa möjliga flexibilitet för programmeraren. Programmeraren kan välja den bästa lösningen som den anser för aktuell uppgift och man är inte alls så styrd av språkets begränsningar då de knappt finns i C++.

Bra video:
här går och ladda ner filmen till datorn (lite längre ner på sidan)
http://www.catonmat.net/blog/bjarne-stroustrup-video-lecture-...
Eller direkt i webbrowsern
http://video.google.com/videoplay?docid=5262479012306588324

Det krävs självklart kunskap för att hantera friheten i C++, har man inte den så kanske man kan jämföra med om en körskoleelev som sätter sig i en formel 1 bil och försöker köra. Det lär bli besök i diket på direkten.

Visa signatur

Programmerare med C++ som huvudspråk.

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av gosh
Que?

Du sa det.

Läste du alls vad jag skrev?

Permalänk
Avstängd
Citat:

Ursprungligen inskrivet av badboll
Du sa det.

Läste du alls vad jag skrev?

Japp, och jag förtydligade för det finns gott om personer som egentligen borde bli språklärare istället för programmerare.

Visa signatur

Programmerare med C++ som huvudspråk.

Permalänk
Medlem

Total förvirring. Du får gärna läsa igenom mitt inlägg igen och se exakt vad jag sa om C++...

Jag ska vara snäll, för att förtydliga för de som absolut inte ska bli språklärare:

Det jag sa var att Java, trots marknadsföringsmoset som ofta kommer i släptåg (och som många verkar köpa), misslyckats med att bli objektorienterat "på riktigt" på grund av några felbeslut som togs i språkets barndom (och som vi tvingats leva med sedan dess).

Och hur man frivilligt kan välja att göra nånting i C++ om det finns alternativ övergår mitt förstånd, men till skillnad från dig ser jag ingen anledning att gå ut och sprida någon sorts förvirrat evangelium.

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av badboll
Och hur man frivilligt kan välja att göra nånting i C++ om det finns alternativ övergår mitt förstånd, men till skillnad från dig ser jag ingen anledning att gå ut och sprida någon sorts förvirrat evangelium.

Det finns inga alternativ till C++ om man vill ha prestanda, flexibilitet och de fördelar som objektorientering erbjuder.
Rätt verkyg för rätt jobb, dock så är C/C++ det enda verktyget som funkar vid mer avancerad programmering, vilket du troligen inte har någon som helst erfarenhet av.

Visa signatur

Intel Core i7-3770K | NVIDIA Geforce GTX 980 | 16 GB DDR3 | DELL P2415Q | DELL U2711 | DELL U2410

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av MagnusL
Det finns inga alternativ till C++ om man vill ha prestanda, flexibilitet och de fördelar som objektorientering erbjuder.

Som sagt, "om det finns alternativ". Ska du krama ur max ur maskinen, eller sitter på en plattform som inte har några vettiga kompilatorer utvecklade för andra språk, så finns det väl inga alternativ. Ibland är inte ens C++ ett alternativ, just för att det saknas kompilatorer. Och, om inte folk har ljugit för mig, så är i ett fåtal fall inte ens C ett alternativ, och man tvingas arbeta i assemblyspråk.

Men när folk sprider C++:s lov som om det vore det bästa alternativet för varje givet scenario, då undrar jag om de verkligen har provat att arbeta i något annat språk över huvud taget... Det är framför allt olyckligt för att många nybörjare förleds av sånt snack att tro att C++ är det enda rätta, och de börjar med att lära sig ett av de svåraste språken som finns. Om inget annat hade det väl varit fasen så mycket bättre för dessa att välja ett språk där kompilatorerna ger vettiga felmeddelanden...

Permalänk
Avstängd
Citat:

Ursprungligen inskrivet av badboll
Och hur man frivilligt kan välja att göra nånting i C++ om det finns alternativ övergår mitt förstånd, men till skillnad från dig ser jag ingen anledning att gå ut och sprida någon sorts förvirrat evangelium.

Det beror på att om man behärskar språket så finns det inget som kan konkurrera. Då menar jag verkliga applikationer, inte snabba hack eller konsultlösningar.
Det kommer du också lära dig om du lär dig behärska C++.

Att många företag väljer andra typer av språk för sina interna lösningar (observera INTERNA) beror bl.a. på svårigheten och hitta duktiga programmerare, men även att det finns språk som är speciellt designade för vissa uppgifter.

Databaser, Spel, Grafiska applikationer (cad, bildbehandlingsprogram m.m.) o.s.v. lär fortsättningsvis utvecklas i C++ förutom i några sällsynta undantagsfall.
Vill du ha prestanda, utvecklar i konkurrens med andra applikationer så finns inget annat alternativ.

Visa signatur

Programmerare med C++ som huvudspråk.

Permalänk
Hedersmedlem
Citat:

Ursprungligen inskrivet av gosh

Databaser, Spel, Grafiska applikationer (cad, bildbehandlingsprogram m.m.) o.s.v. lär fortsättningsvis utvecklas i C++ förutom i några sällsynta undantagsfall.
Vill du ha prestanda, utvecklar i konkurrens med andra applikationer så finns inget annat alternativ.

Så länge man är i en windows-miljö, kanske. I OS X är det Objective-C som gäller om du inte vill sitta med Carbon, som numera är deprecated till fördel för Cocoa (Obj-C). Det är ingen större brist på fart där heller. Precis som du skriver, om man utvecklar i konkurrens så finns det inget annat alternativ (till Obj-C).

Visa signatur

Asus ROG STRIX B550-F / Ryzen 5800X3D / 48 GB 3200 MHz CL14 / Asus TUF 3080 OC / WD SN850 1 TB, Kingston NV1 2 TB + NAS / Corsair RM650x V3 / Acer XB271HU (1440p165) / LG C1 55"
Mobil: Moto G200

Permalänk
Medlem

Kanske en intressant övning, men att skriva ett större projekt med dom begränsningarna är ju bara dumt, alla uppgifter är inte lämpligt att lösa i extrem-OO.

Visa signatur

I just love the fact that there is a global integer variable named 'i'. Just think, you will never need to declare your loop variable again!
To avoid collisions where a loop that uses 'i' calls another function that loops with 'i', be sure to stack 'i' and restore it when your function exits.

Permalänk
Avstängd
Citat:

Ursprungligen inskrivet av Thomas
Så länge man är i en windows-miljö, kanske. I OS X är det Objective-C som gäller om du inte vill sitta med Carbon, som numera är deprecated till fördel för Cocoa (Obj-C). Det är ingen större brist på fart där heller. Precis som du skriver, om man utvecklar i konkurrens så finns det inget annat alternativ (till Obj-C).

Skall man programmerar i konkurrens med andra så är det riktigt korkat och välja något som inte går och flytta till andra plattformar.
Väljs Objective-C så är man väl fast i OS X?
Samma vad gäller och ställa in kompilatorer och annat för diverse specialare som finns för just deras plattform utan förstå vad man gör.

Vill man ta del av färdigskriven kod som håller hög kvalitet så behöver man köra på standard. Nu känner jag inte till Objective-C men det är viktigt och kolla upp problematiken så man inte bygger in sig.

Visa signatur

Programmerare med C++ som huvudspråk.

Permalänk
Hedersmedlem

Jo, visst bygger man in sig, helt klart, precis som man gör om man använder winapi. OS X har ju fått en stämpel att alla program flyter ihop bra, och det beror till stor del på Cocoa. Program som är portade från *nix/windows till OS X känns alltid otrevliga att använda, med väldigt få undantag. Detsamma gällde Firefox fram till version 3, numera känns det OK, men det är ändå inte lika inbakat som allt annat.

Hur man ska göra för att få ett program som känns bra på alla plattformar vet jag inte, får jag väl säga, men om det verkligen ska kännas hemma så är frågan om det inte "bara" är till att göra tre skilja program, kanske med nåt library som innehåller grundfunktionerna.

Visa signatur

Asus ROG STRIX B550-F / Ryzen 5800X3D / 48 GB 3200 MHz CL14 / Asus TUF 3080 OC / WD SN850 1 TB, Kingston NV1 2 TB + NAS / Corsair RM650x V3 / Acer XB271HU (1440p165) / LG C1 55"
Mobil: Moto G200

Permalänk

Jag tycker att dessa restriktioner låter ganska vettiga. Jag ska nog ta och försöka följa dem lite noggrannare än vad jag gör nu.

Om man inte vet vilka restriktioner man har i var språk så kommer man aldrig att kunna skriva ordentlig kod. Med ett enklare språk (eller paket/bibliotek) så är risken större att man väljer fel metod, och löser därför inte problem på ett optimalt och korrekt sätt.

En klurig fråga: Hur inverterar man en matris?

Permalänk
Avstängd
Citat:

Ursprungligen inskrivet av Thomas
Jo, visst bygger man in sig, helt klart, precis som man gör om man använder winapi.

Det är sant men det är inte alls lika stort problem om man ser till och ha någon form av villkorad kompilering.
Problemet blir klart större om koden inte kan kompilera på grund av att syntaxen är annorlunda eller finesser i språket som är unika.

Angående plattsformsspecifika funktioner så brukar det inte vara något större problem och hantera eller så kanske man väljer någon generellt bibliotek (ex: wxWidgets, Qt ).

Visa signatur

Programmerare med C++ som huvudspråk.