Permalänk
Medlem

objektorienterade principer

Har en snabb fråga. Skriver ett javaprogram och har klasserna banklogic, customer och savingsaccount. När man stänger ett konto ska pengarna plus ränta returneras. Bankloic har metoden public String closeAccount(String pNr, int accountId).

Min fråga är var bör jag lägga matematiken? Just nu är jag på väg att lägga den i savingsaccount och sedan bara returnera antalet pengar när man stänger kontot. Är det en bra lösning?

Permalänk

Lutar åt savingsaccount för min del, då definerar den sitt egna betenende. Sedan föreslår jag att du istället för att skicka in en sträng med pNr till closeAccount använder dig av den customer som har accountet. Då går det även att se ifall given kund faktiskt äger kontot som skall stängas

Permalänk
Skrivet av SexMachine:

Har en snabb fråga. Skriver ett javaprogram och har klasserna banklogic, customer och savingsaccount. När man stänger ett konto ska pengarna plus ränta returneras. Bankloic har metoden public String closeAccount(String pNr, int accountId).

Min fråga är var bör jag lägga matematiken? Just nu är jag på väg att lägga den i savingsaccount och sedan bara returnera antalet pengar när man stänger kontot. Är det en bra lösning?

Skapa en klass för matematiken tänk att det ska vara en säck med funktioner bara.

Skickades från m.sweclockers.com

Permalänk
Medlem

En klass ska bara ha ett jobb. Savingsaccount låter som det representerar en kunds konto, uträkningarna bör därför ligga separerade från dessa. Savingsaccount ska endast hålla reda på kontonr, vilken kund det tillhör, räntan på kontot, saldo, bonusar etc.

Vet inte hur det ser ut i Java, men i C# hade du kunnat göra en statisk klass som heter typ AccountCalculations, där du definerar dina metoder och tar emot ett(eller flera) konton som parameter och returerar ett värde.

Sen i din business-logic klass och metod för att stänga ett konto anropar du det vid en validerad stängning (namn kan du få se över ),

var remainingValue = AccountCalculations.CloseCustomerAccountsReturns(Customer.SavingAccounts);

Alternativt att det är abstraherat till ett interface och att din business klass endast refererar det, t.ex. IAccountCalculator sen sätter du upp det med dependency injection. Då blir det mycket enklare att skriva tester för logiken. Men det är nog överkurs i detta fall.

Permalänk
Medlem

Får tacka för svaren. Det är en skoluppgift så jag är lite begränsad i vad jag får göra. Jag la metoden i savingsaccount.

EDIT: vi har fått testet för logiken redan så det blir lite att skriva programmet runt testet.

Permalänk
Medlem
Skrivet av SexMachine:

Har en snabb fråga. Skriver ett javaprogram och har klasserna banklogic, customer och savingsaccount. När man stänger ett konto ska pengarna plus ränta returneras. Bankloic har metoden public String closeAccount(String pNr, int accountId).

Min fråga är var bör jag lägga matematiken? Just nu är jag på väg att lägga den i savingsaccount och sedan bara returnera antalet pengar när man stänger kontot. Är det en bra lösning?

Om det är en skoluppgift och du är begränsad till dessa tre klasser tänker jag ungefär såhär:
Banklogic (borde vara BankLogic för övrigt) -
Jag beskriver vad en bank kan göra

Customer -
Jag beskriver vad en customer har för egenskaper (eller vad en customer är)

SavingsAccount (CamelCase här också) -
Jag beskriver vad ett sparkonto har för egenskaper

Uppsättningen får mig att tänka på MVC (Model View Controller) designmönstret.
I det så har du en model som håller information om objekten, controller som manipulerar objekten, och slutligen view som presenterar objektet.

Hoppas det skapar någon förståelse!

Visa signatur

Stationär: Core i9 13900k | Asus X790 ROG Strix Gaming-F | 32GB DDR5 | GeForce RTX 5090 | Lian Li PC-O11 dynamic evo
Laptop: Macbook Pro 16" | Apple M1 Max

Permalänk
Medlem

För mig låter det helt fel att ens ha en funktion som heter closeAccount. Det blir ju i så fall bank.closeAccount(), i min värld borde det bli account.close()

Skickades från m.sweclockers.com

Visa signatur

-- Arkade --

Permalänk
Medlem
Skrivet av Arkade:

För mig låter det helt fel att ens ha en funktion som heter closeAccount. Det blir ju i så fall bank.closeAccount(), i min värld borde det bli account.close()

Skickades från m.sweclockers.com

Det beror på situationen, om close ska vara en metod på Account så innebär det att Account ska hålla reda på sitt saldo och även funktionalitet för hur det ska stängas. Låter väl lite märkligt att ett konto kan stänga sig själv?

En klass ska bara ha ett jobb, Account lär vara en POCO som fylls via en databas och representerar en kunds konto. Uträkningar och principer kring stängning sker via affärslogikslagret för applikationen inte direkt i ditt domain objekt.

Om t.ex. en stängning också ska skicka ett mail/sms som bekräftelse till kunden, ska denna logik också ligga i account.close()?
Även om det refererar till abstraktioner så känns det som att account just nu gör mycket mer än vad ett account ska göra.

Snarare bör ett servicelager anropas, där kontonummer, tillsammans med den behöriga kundens ID (efter authenticering) utför ärendet.

AccountService.CloseAccount(account);

Detta i sin tur kommer validera stängningen och anropa datalagret och eventuella SMS / Emailstjänster.
Då har du fått bort all logik från account och account representerar istället bara information om just det kontot, som det bör göra.

Permalänk
Medlem
Skrivet av zaibuf:

Det beror på situationen, om close ska vara en metod på Account så innebär det att Account ska hålla reda på sitt saldo och även funktionalitet för hur det ska stängas. Låter väl lite märkligt att ett konto kan stänga sig själv?

En klass ska bara ha ett jobb, Account lär vara en POCO som fylls via en databas och representerar en kunds konto. Uträkningar och principer kring stängning sker via affärslogikslagret för applikationen inte direkt i ditt domain objekt.

Om t.ex. en stängning också ska skicka ett mail/sms som bekräftelse till kunden, ska denna logik också ligga i account.close()?
Även om det refererar till abstraktioner så känns det som att account just nu gör mycket mer än vad ett account ska göra.

Snarare bör ett servicelager anropas, där kontonummer, tillsammans med den behöriga kundens ID (efter authenticering) utför ärendet.

AccountService.CloseAccount(account);

Detta i sin tur kommer validera stängningen och anropa datalagret och eventuella SMS / Emailstjänster.
Då har du fått bort all logik från account och account representerar istället bara information om just det kontot, som det bör göra.

Jag tycker dock att Account borde ha logik och att om man skriver metoder som t.ex. har typen av objektet i namnet så är det borderline funktionell programmering, inte OOP.

Om vi tar streams som exempel så har stream metoden Close() på sig, kollat man dokumentationen så skriver man alltså stream.Close(), inte StreamHandler.CloseStream(stream).

Går man igen Microsofts exempel med bankkonto (https://docs.microsoft.com/en-us/dotnet/csharp/tutorials/intr...) även om det egentligen är ointressant vad det är så lägger dom logiken för bankkonto på just bankkonto.

Skickades från m.sweclockers.com

Visa signatur

-- Arkade --

Permalänk
Medlem
Skrivet av Arkade:

Jag tycker dock att Account borde ha logik och att om man skriver metoder som t.ex. har typen av objektet i namnet så är det borderline funktionell programmering, inte OOP.

Om vi tar streams som exempel så har stream metoden Close() på sig, kollat man dokumentationen så skriver man alltså stream.Close(), inte StreamHandler.CloseStream(stream).

Går man igen Microsofts exempel med bankkonto (https://docs.microsoft.com/en-us/dotnet/csharp/tutorials/intr...) även om det egentligen är ointressant vad det är så lägger dom logiken för bankkonto på just bankkonto.

Skickades från m.sweclockers.com

Det där är endast ett väldigt basic exempel som är en introduktion till klasser för en nybörjare.
I verkligheten skriver du alltid till en databas så det finns ingen mening att en insättning ska se i klassen BankAccount.

BankAccount ska bara vara en simpel POCO som representerar ett konto.
Tycker du att BankAccount ska referera ditt datalager för att sätta in datan? Läs på om clean architecture.

Att Stream har en Close är helt logiskt, då du har en öppen socket och låser en fil och behöver stänga läsningen och disposa ditt objekt.

Permalänk
Medlem
Skrivet av zaibuf:

BankAccount ska bara vara en simpel POCO

Det tycker du, det tycker inte jag.

Skickades från m.sweclockers.com

Visa signatur

-- Arkade --

Permalänk
Medlem
Skrivet av Arkade:

Det tycker du, det tycker inte jag.

Skickades från m.sweclockers.com

Du ber ju inte ditt konto att stänga sig, du kontaktar banken och ber dem stänga ditt konto.
Men läser du en bok så väljer du själv när du slutar läsa och stänger boken.