DTO & DAO در توسعه نرم افزار

DTO (Data Transfer Object) و DAO (Data Access Object) الگوهای طراحی کلیدی هستند که اغلب در توسعه نرم افزار، به ویژه در برنامه های کاربردی مبتنی بر جاوا استفاده می شوند. در اینجا توضیحی در مورد هر یک و نحوه ارتباط آنها آورده شده است:
DTO (شیء انتقال داده):
هدف: DTO یک شی ساده است که برای انتقال داده ها بین لایه ها یا فرآیندهای یک برنامه طراحی شده است.
Use Case: اغلب برای کپسوله کردن داده ها به گونه ای استفاده می شود که تعداد فراخوانی های متد را به حداقل می رساند (با جمع کردن داده های مرتبط) و اطمینان حاصل می کند که منطق تجاری غیر ضروری در آن وجود ندارد.
خصوصیات:
حاوی فیلدهایی برای ذخیره داده ها
هیچ منطق تجاری یا روشی جز دریافت کننده ها و تنظیم کننده ها وجود ندارد.
می تواند برای ارتباط شبکه یا پاسخ های API سریال شود.
نمونه ای از DTO:
کلاس عمومی UserDTO {
نام کاربری رشته خصوصی;
ایمیل رشته خصوصی؛
// Constructor
public UserDTO(String username, String email) {
this.username = username;
this.email = email;
}
// Getters and setters
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
DAO (شیء دسترسی به داده):
هدف: DAO مسئول تعامل با پایگاه داده است. روشهایی را برای انجام عملیات CRUD (ایجاد، خواندن، بهروزرسانی، حذف) بر روی یک منبع داده ارائه میکند و منطق پایداری را انتزاع میکند.
Use Case: با رعایت اصل مسئولیت واحد، عملیات پایگاه داده را از منطق تجاری جدا می کند.
خصوصیات:
پرس و جوهای SQL یا منطق ORM (مانند Hibernate، JPA) را در بر می گیرد.
رابط با لایه پایگاه داده
متدهای قابل استفاده مجدد مانند save()، findById()، delete() و غیره را ارائه می دهد.
نمونه ای از DAO:
واردات java.sql.Connection.
وارد کردن java.sql.PreparedStatement;
وارد کردن java.sql.ResultSet.
کلاس عمومی UserDAO {
اتصال خصوصی؛
public UserDAO(Connection connection) {
this.connection = connection;
}
public UserDTO getUserById(int id) throws Exception {
String query = "SELECT username, email FROM users WHERE id = ?";
PreparedStatement statement = connection.prepareStatement(query);
statement.setInt(1, id);
ResultSet resultSet = statement.executeQuery();
if (resultSet.next()) {
String username = resultSet.getString("username");
String email = resultSet.getString("email");
return new UserDTO(username, email);
}
return null;
}
public void saveUser(UserDTO user) throws Exception {
String query = "INSERT INTO users (username, email) VALUES (?, ?)";
PreparedStatement statement = connection.prepareStatement(query);
statement.setString(1, user.getUsername());
statement.setString(2, user.getEmail());
statement.executeUpdate();
}
}
ادغام:
در یک برنامه کاربردی، یک DAO داده ها را از پایگاه داده بازیابی می کند، آنها را به اشیاء DTO تبدیل می کند و آنها را به لایه های دیگر (مانند سرویس ها یا کنترلرها) می فرستد.
جریان مثال:
-
لایه کنترل کننده: لایه سرویس را فراخوانی می کند.
-
لایه سرویس: برای واکشی یا ذخیره داده ها با DAO تعامل دارد.
-
لایه DAO: داده ها را واکشی می کند، آن ها را به DTO تبدیل می کند و برمی گرداند.
مثال کد:
// کنترل کننده
public UserDTO getUserDetails(int id) {
بازگشت userService.getUserById(id);
}
// سرویس
public UserDTO getUserById(int id) {
بازگشت userDAO.getUserById(id);
}
مزایا:
DTO: انتقال داده ها را بهینه می کند و پاسخ های UI یا API خارجی را از موجودیت های داخلی جدا می کند.
DAO: منطق دسترسی به پایگاه داده را متمرکز می کند و آن را قابل استفاده مجدد و قابل آزمایش می کند.
اگر توضیح یا مثال های عمیق تری می خواهید به من اطلاع دهید!