Avatar billede havmaage Juniormester
21. maj 2014 - 09:03 Der er 4 kommentarer

Et generalt oop spørgsmål vedr interfaces

Hej
Dette spørgsmål kunne vel ligeså godt stilles i c++ c# eller andre kategorier, men fordi java er 100% objekt orienteret og fordi der er så mange der bruger det stiller jeg spørgsmålet her.

Jeg har af og til siddet med små stumper source code, eller skulle ændre/rette i et eksisterende program. I mange tilfælde støder jeg på interface erklæringer.
Som jeg forstår det er et interface en "tom skal" der definere hvordan en klasse skal se ud, hvilke metoder den skal indeholde og osv.
Når man så skriver sin klasse som implementere dette interface vil man blive tvunget til at skrive de metoder og egenskaber man har erklæret i sit interface.
Men hvorfor ?
Hvad er fordelen ved at anvende interface
Er der tilfælde hvor man SKAL anvende dem
Hvad gør de godt for
Giver det mening når man designer sit program at starte med at definere alle sine interfaces
Man behøver vel i grunden ikke disse interfaces, men jeg formoder det er "best practice" at anvende dem.

Håber der er et par stykker herinde der vil give mig et par linier med på vejen i min forståelse af oop. Det er meget anderledes for en gammel scripter og jeg ville faktisk gerne anvende de fordele oop giver, men jeg synes tit det ender op med noget spaghetti mix af struktureret kode og klasser blandt sammen. Og det er nok min egen skyld i bund og grund jo :-)
Avatar billede clausc Nybegynder
21. maj 2014 - 09:52 #1
Du får dekoblet afhængigheder mellem klasser og du kan gøre dette i højere grad med interfaces end med nedarvning (i sprog der ikke tillader multipel nedarvning).

Der kan skrives langt langt mere om emnet, men ovenstående er i mine øjne essensen.
Avatar billede Slater Ekspert
21. maj 2014 - 09:54 #2
Du skal se interfaces som en kontrakt. En klasse bør ikke vide hvordan andre klasser udfører en funktion, kun at de kan det - og hvordan de skal bede dem om det.

Interfaces er bl.a. gode, når du får behov for at udskifte en klasse på et senere tidspunkt. Eksempel: du har en webshop, og du har en indkøbskurv-klasse og en betalingsklasse. Denne betalingsklasse benytter DIBS. og har en pay() metode, der tager kortnummer, udløbsdato og CSC i den rækkefølge. Senere får du et bedre tilbud fra ePay, og vil gerne skifte til dem, så du laver en ny betalingsklasse. Hvis du har et interface, som definerer betalingsklasser, så er du nødt til at lave den nye med samme metode og samme parametre, og den er derfor en drop-in replacement af den forrige. Du peger bare på den nye klasse, og så virker alting med det samme.

Naturligvis kan du kalde dine metoder det samme uden et interface, men interfacet tvinger dig til det, og minimerer dermed risikoen for bugs i fremtiden, fordi du lige havde glemt en metode eller lignende. Samtidig kan det være utrolig hjælpsomt, hvis der er flere kodere på samme projekt. De fremtidige er ikke i tvivl om, hvordan de skal kode fremtidige klasser, hvis de er bundet af et interface - og hvis flere arbejder samtidig, f.eks. en front-ender og en back-ender, kan man beslutte sig for sine interfaces før man skriver en linje anden kode, og dermed kunne færdiggøre og teste sin kode, uden den anden person er færdig med sin - fordi man ved hvordan de skal "tale sammen", når de er færdige.

Men hvis du ved du er alene, din kode ikke er stor og du ikke kommer til at ændre koden ret meget i fremtiden, så er interfaces ofte unødvendige.
Avatar billede havmaage Juniormester
23. maj 2014 - 13:47 #3
Tak for jeres fine input. Det er noget jeg kan arbejde videre med. læg gerne et svar så jeg kan lukke tråden igen.
Avatar billede arne_v Ekspert
27. maj 2014 - 04:20 #4
Et godt lag vil vaere karakteriseret ved kun at have foelgende med public visibility:
- rene data klasser
- nogle faa interfaces
- en enkelt factory class (kan evt. erstattes med eksternt DI library)
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
Kurser inden for grundlæggende programmering

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