آموزش جاوا قسمت سیزدهم
درود به همه دوستان
چنگانی هستم و با آموزش جاوا، جلسه سیزدهم در خدمتتون هستم.
در جلسه قبل کلاسهای مورد نیاز پروژه ATM را نوشتیم. موجودیتها را همراه با ویژگیها و تواناییهای اونها گفتیم.
خوب این جلسه شروع کنیم به پیاده سازی کلاسها و متدهای مورد نیاز.
اول کلاس Account را پیاده سازی کنیم.
همانطور که جلسات قبل گفتیم همیشه همه فیلدها را به صورت private تعریف میکنیم(اصل کپسولهسازی) و برای این که بتونیم به مقدار این فیلدها از بیرون دسترسی داشته باشیم برای تک تک این فیلدها متد get و set مینویسیم.
قدم بعدی پیاده سازی متد incValue و decValue هست که منطق خیلی سادهای دارد.
public class Account {
private int id;
private double value;
private void incValue(double v) {
value = value + v;
}
public void decValue(double v) {
value = value - v;
}
public int getId() {
return id;
}
public void setId(int id) {
this.is = id;
}
public double getValue() {
return value;
}
public void setValue(double value) {
this.value = value;
}
}
کلاس بعدی کلاس Transaction هست که نیاز به پیاده سازی دارد.
برای این کلاس یک سازنده تعریف میکنیم تا در زمان new شدن مقادیر مورد نیازش رو دریافت کند.
دقت کنید که چون تراکنشها در آینده نیاز به تغییر دادن ندارند پس فیلدهای آنها را به صورت final تعریف میکنیم. برای یادآوری، وقت فیلدی به صورت final تعریف شود، در زمان ساخته شدن مقدار میگیرد و دیگر این مقدار قابل تغییر نیست.
بنابراین نمیتوانیم برای این فیلدها متد set بنویسیم ولی برای اونها متد get را پیاده سازی میکنیم.
public class Transaction {
private final Date date;
private final Type type;
private final User target;
private final double value;
public Transaction(Date date, Type type, User target, double value) {
this.date = date;
this.type = type;
this.target = target;
this.value = value;
}
public Date getDate() {
return date;
}
public Date getType() {
return type;
}
public Date getTarget() {
return target;
}
public Date getValue() {
return value;
}
public enum Type {
WITHDRAWAL,
DEPOSITS,
TRANSFER;
}
}
کلاس بعدی User هست
ابتدا فیلدهایی که نیاز به تغییر در طول حیات برنامه را ندارند را به صورت final تعریف میکنیم چون اگر فراموش نکرده باشید، قرار شد همه چیز به صورت final باشد مگر اینکه خلافش ثابت شود.
در قدم بعدی سازندهای برای کلاس User تعریف میکنیم و یک سری ورودی دریافت میکنیم و سایر چیزایی که نیاز داریم را new میکنیم.
دقت کنید حتما باید account و لیست transactions در خطهای ۲۳ و ۲۴ new شوند وگرنه در زمان استفاده از آنها به ما پیغام خطا میدهد.
همچنین برای همه فیلدها متدهای get و set را پیاده سازی میکنیم.
public class User {
private final Account account;
private final List<Transaction> transaction;
private int id;
private String name;
private String family;
private String username;
private String password;
public User(int id, String name, String family, String username, String password) {
this.id = id;
this.name = name;
this.family = family;
this.username = username;
this.password = password;
account = new Account();
transactions = new ArrayList<>();
}
}
برای راحتی کار و تایپ نکردن همه این سازندهها و متدهای get و set، ابزاری وجود دارد که این کار را انجام میدهد. مثلا در انتلیج شما میتونید در قسمتی از کدتون کلیک راست کنید و گزینه Generate را بزنید از آنجا گزینه سازنده یا Counstractor را کلیک کنید و به صورت اتوماتیک سازنده تولید شود. همچنین میتوانیم به صورت اتوماتیک متدهای get و set پیاده سازی شود.
همچنین این مورد در IDE نتبینز وجود دارد و شما میتونید کدهای مورد نیاز را به صورت اتوماتیک تولید کنید.
متد بعدی که میخواهیم پیاده سازی کنیم، withdrawal یا همان برداشت هست.
ورودی این تابع همان جور که انتظار داریم یک مقدار یا value هست که در واقع ما باید به این میزان ازز حساب کاربر کم کنیم.
پس در خط ۲۸ ما ابتدا این مقدار را با استفاده از تابع decValue مربوط به موجودیت account کاربر هست کم میکنیم. در واقع اینجوری ما به میزان value از حساب کاربر کم کردهایم.
در ادامه باید یک تراکنش تولید کرده و به لیست تراکنشهای کاربر اضافه کنیم. بنابراین ابتدا یک نمونه از کلاس Date برای داشتن تاریخ تولید میکنیم و سپس یک نمونه از کلاس transaction.
همانطور که میبینید ورودی سازنده کلاس تراکنش به ترتیب تاریخ، نوع تراکنش، کاربری که این عمل را انجام داده و مبلغ مورد نظر هست.
به ترتیب ما مقدار date در ابتدا ساختیم را میدهیم، مقدار دوم را با Transaction.Type.WITHDRAWAL مقدار دهی میکنیم. در واقع ما مقدار WITHDRAWAL را از enum تایپ که در کلاس Transaction را پاس میدهیم.
استفاده از کلمه this در واقع اشاره به موجودیت user که این متد برای آن صدا زده است، میکند. در واقع همان کاربری که ما داریم از حساب آن کم میکنیم.
و مقدار بعدی سازنده هم همان مقدار value هست که به عنوان ورودی متد گرفته بودیم.
در انتها نیست این نمونه تراکنش که ساخته بودیم را به لیست تراکنشهای کاربر اضافه میکنیم.
public void withdrawal(double value) {
account.decValue(value);
final Date date = new Date();
final Transaction transaction = new Transaction(date, Transaction.Type.WITHDRAWAL, this, value);
transactions.add(transaction);
}
متد بعدی متد deposits که پیاده سازی میکنیم
خیلی خیلی منطق شبیه به متد withdrawal دارد ولی با تفاوت های کوچکی. در ابتدا بجای کم کردن از حساب کاربر ما باید به حساب کار مبلغ value را واریز کنیم یعنی حساب کاربر را افزایش دهیم بنابراین از متد account.incValue استفاده میکنیم.
همچنین در زمان ساخت نمونه تراکنش، Type تراکنش را از نوع DEPOSITS انتخاب میکنیم.
و در انتها هم مثل متد withdrawal، این تراکنش را به لیست تراکنشهای کاربر اضافه میکنیم.
public void desposits(double value) {
account.incValue(value);
final Date date = new Date();
final Transaction transaction = new Transaction(date, Transaction.Type.DEPOSITS, this, value);
transactions.add(transaction);
}
متد بعدی که در موردش اون میخواهیم حرف بزنیم متد transfer هست که در واقع مبلغی را از حساب کاربر کم کرده و به حساب کاربر target میریزد. بنابراین مقدار value و کاربر مقصد یا همان target به عنوان ورودیهای متد دریافت میشود.
ابتدا ما مقدار value را از حساب خود کاربر کم میکنیم (خط ۴۷)
سپس مبلغ value را به حساب کاربر مقصد اضافه میکنیم (خط ۴۹). دقت شود برای دسترسی به حساب کاربر مقصد ابتدا باید acoount مربوط به کاربر مقصد را صدا بزنیم و بعد متد incValue مربوط به آنرا فراخوانی میکنیم.
در مرحله یعدی باید دو تراکنش تولید کنیم. یکی برای خود کاربر که عملیات انتقال را انجام داده و یک تراکنش دیگری برای کاربر مقصد که این مبلغ به حساب آن واریز شده است.
ایتدا یک تراکنش با مقدار date و تایپ Type.TRANSFER میسازیم همچنین کاربری که این انتقال برای ان انجام میشود target هست پس ورودی بعدی سازنده تراکنش target میشود و وردی آخر سازنده تیز مقدار value.
و این تراکنش را به لیست تراکنشهای کاربر اضافه میکنیم
همچنین نمونه تراکنش۲ را برای کاربر مقصد میسازیم که با نوع DEPOSITS. و در انتها این تراکنش را به لیست تراکنشهای کاربر اضافه میکنیم.
public void transfer(double value, User target) {
account.decValue(value);
target.acount.incValue(value);
final Date date = new Date();
final Transaction transaction1 = new Transaction(date, Transaction.Type.TRANSFER, target, value);
transactions.add(transaction1);
final Transaction transaction2 = new Transaction(date, Transaction.Type.DEPOSITS, this, value);
target.transactions.add(transaction2);
}
سایر پیاده سازیهای برای جلسه آینده باشد.
نظرات کاربران