Deo zbornika Uvod u softversko inženjerstvo
Objekat za pristup podacima
Objekat za pristup podacima (data access object, skraćeno DAO) je obrazac koji apstrahuje pristup podacima i omogućava da aplikacija komunicira sa bazom, API-jem ili drugim izvorima podataka bez direktne zavisnosti od konkretne tehnologije.
Objekat za pristup podacima se koristi za obavljanje standardnih operacija kao što su čitanje, upisivanje, ažuriranje i brisanje podataka (CRUD).
DAO obrazac smanjuje zavisnost komponenti od konkretnog izvora podataka. Na primjer, ako razmišljamo o prelasku s MySQL
na MongoDB
, sve promjene je potrebno izvršiti samo u jednom objektu.
Primer u Javaskriptu
Primer objekta za pristup API podacima u JavaScriptu:
class Api {
constructor(baseUrl) {
this.baseUrl = baseUrl
}
async GET(endpoint) {
try {
const response = await fetch(`${this.baseUrl}/${endpoint}`)
if (!response.ok) throw new Error('Network error')
return await response.json()
} catch (error) {
console.error('Fetch error:', error)
}
}
async POST(endpoint, data) {
try {
const response = await fetch(`${this.baseUrl}/${endpoint}`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify(data),
})
if (!response.ok) throw new Error('Network error')
return await response.json()
} catch (error) {
console.error('Fetch error:', error)
}
}
async PUT(endpoint, data) {
try {
const response = await fetch(`${this.baseUrl}/${endpoint}`, {
method: 'PUT',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify(data),
})
if (!response.ok) throw new Error('Network error')
return await response.json()
} catch (error) {
console.error('Fetch error:', error)
}
}
async DELETE(endpoint) {
try {
const response = await fetch(`${this.baseUrl}/${endpoint}`, {
method: 'DELETE',
})
if (!response.ok) throw new Error('Network error')
return await response.json()
} catch (error) {
console.error('Fetch error:', error)
}
}
}
// upotreba
const API = new Api('https://lorem-api.com/api/')
API.GET('user/1')
.then(data => console.log('Response: ' + data))
.catch(error => console.log('Error:', error))
API.POST('user', { name: 'John Doe', email: 'john@example.com' })
.then(data => console.log('Response: ' + data))
.catch(error => console.log('Error:', error))
API.PUT('user/1', { name: 'John Doe Junior' })
.then(data => console.log('Response: ' + data))
.catch(error => console.log('Error:', error))
API.DELETE('user/1')
.then(data => console.log('Response: ' + data))
.catch(error => console.log('Error:', error))
Primer u Node.js-u
Prost primer objekta za interakciju sa bazom podataka (koristeći, na primer, MongoDB):
class UserDAO {
constructor(db) {
this.db = db
this.collection = db.collection('users')
}
async createUser(user) {
return await this.collection.insertOne(user)
}
async getUserById(userId) {
return await this.collection.findOne({ _id: userId })
}
async updateUser(userId, updateData) {
return await this.collection.updateOne({ _id: userId }, { $set: updateData })
}
async deleteUser(userId) {
return await this.collection.deleteOne({ _id: userId })
}
}
Primer u C#
Prost primer u C# koji koristi Entity Framework:
using System;
using System.Linq;
public class UserDAO {
private readonly AppDbContext _context;
public UserDAO(AppDbContext context) {
_context = context;
}
public User GetUserById(int userId) {
return _context.Users.SingleOrDefault(u => u.Id == userId);
}
public void CreateUser(User user) {
_context.Users.Add(user);
_context.SaveChanges();
}
public void UpdateUser(User user) {
_context.Users.Update(user);
_context.SaveChanges();
}
public void DeleteUser(int userId) {
var user = _context.Users.SingleOrDefault(u => u.Id == userId);
if (user != null) {
_context.Users.Remove(user);
_context.SaveChanges();
}
}
}