Home
Представим, что ты строишь дом, и у тебя есть целая команда специалистов, у каждого из которых своя задача. Вот как наши термины из программирования соответствуют роли каждого члена команды в строительстве дома:
Data
Здесь хранятся и управляются данные, из которых строится дом. Это как хранение материалов и данных о доме.
Data Model (Модель данных):
Это чертеж или модель материалов для дома. Например, чертежи окон, дверей, формы стен и т.д. Она описывает, как должны выглядеть все части дома.
import '../domain/entities/product_entity.dart';
class ProductModel extends Product {
ProductModel({
required super.name,
required super.price,
required super.category,
required super.description,
super.isLiked,
super.quantity = 1,
});
// fromJson и toJson для работы с данными
factory ProductModel.fromJson(Map<String, dynamic> json) {
return ProductModel(
name: json['name'],
price: json['price'],
category: json['category'],
description: json['description'],
isLiked: json['isLiked'] ?? false,
quantity: json['quantity'] ?? 1,
);
}
Map<String, dynamic> toJson() {
return {
'name': name,
'price': price,
'category': category,
'description': description,
'isLiked': isLiked,
'quantity': quantity,
};
}
}
Repositories Implementation (Реализация репозиториев):
Это как логистическая служба, которая знает, как и откуда доставить нужные материалы для строителей. Здесь описывается, как именно мы будем доставлять данные из источников данных в приложение.
import 'package:grocery_app/feature/home/data/product_data_source.dart';
import '../domain/entities/product_entity.dart';
import '../domain/repositories/product_repository.dart';
class ProductRepositoryImpl implements ProductRepository {
final ProductDataSource dataSource;
ProductRepositoryImpl(this.dataSource);
@override
Future<List<Product>> getProducts() async {
return await dataSource.getProductsFromDb();
}
@override
Future<List<Product>> searchProducts(String query) async {
final products = await dataSource.getProductsFromDb();
return products
.where((product) =>
product.name.toLowerCase().contains(query.toLowerCase()))
.toList();
}
@override
Future<List<Product>> filterByPrice(double minPrice, double maxPrice) async {
final products = await dataSource.getProductsFromDb();
return products
.where(
(product) => product.price >= minPrice && product.price <= maxPrice)
.toList();
}
@override
Future<List<Product>> filterByCategory(String category) async {
final products = await dataSource.getProductsFromDb();
return products.where((product) => product.category == category).toList();
}
@override
Future<void> toggleLike(Product product) async {
product.isLiked = !product.isLiked;
}
@override
Future<void> addToCart(Product product) async {
Product? existingItem;
for (var item in cart) {
if (item.name == product.name) {
existingItem = item;
break;
}
}
if (existingItem != null) {
// Если продукт найден, увеличиваем количество
existingItem.quantity++;
} else {
// Если продукта нет в корзине, добавляем его
cart.add(product);
}
}
@override
Future<void> decreaseQuantity(Product product) {
// TODO: implement decreaseQuantity
throw UnimplementedError();
}
@override
Future<void> increaseQuantity(Product product) {
// TODO: implement increaseQuantity
throw UnimplementedError();
}
}
Data Source (Источник данных):
Это склад материалов для строительства. Например, склад с кирпичами, досками, гвоздями. Это место, где мы берем сырье (данные) — будь то данные с сервера, из базы данных или временное хранилище в приложении.
import 'package:grocery_app/feature/home/data/product_model.dart';
import '../domain/entities/product_entity.dart';
abstract class ProductDataSource {
Future<List<ProductModel>> getProductsFromDb();
}
class ProductLocalDataSource implements ProductDataSource {
@override
Future<List<ProductModel>> getProductsFromDb() async {
// Пример локальных данных
return [
ProductModel(
name: 'Laptop',
price: 1000,
category: 'Electronics',
description: 'High-end laptop', quantity: 1),
ProductModel(
name: 'Smartphone',
price: 800,
category: 'Electronics',
description: 'Latest smartphone', quantity: 1),
ProductModel(
name: 'Shoes',
price: 50,
category: 'Fashion',
description: 'Comfortable shoes', quantity: 1),
ProductModel(
name: 'Shirt',
price: 25,
category: 'Fashion',
description: 'Stylish shirt', quantity: 1),
ProductModel(
name: 'Headphones',
price: 150,
category: 'Electronics',
description: 'Noise-cancelling headphones', quantity: 1),
];
}
}
List<Product> cart = [];
Domain
Это уровень, где определяется, что и как должно быть построено.
Entities (Сущности):
Это основные объекты, описывающие дом. Например, дом как объект может иметь комнаты, стены, окна. Это набор качеств, которые обязательно должны быть у нашего дома (наше представление о доме).
class Product {
final String name;
final double price;
final String category;
final String description;
bool isLiked;
int quantity;
Product({
required this.name,
required this.price,
required this.category,
required this.description,
this.isLiked = false,
this.quantity = 1,
});
}
Repositories (Репозиторий):
Это интерфейс (инструкция) для логистической службы, описывающий, какие данные нам нужно доставить. Например, «доставь окна, двери и кирпичи для стен». Это говорит, что должно быть, но не говорит, как именно.
import 'package:grocery_app/feature/home/data/product_model.dart';
import '../entities/product_entity.dart';
abstract class ProductRepository {
Future<List<Product>> getProducts();
Future<List<Product>> searchProducts(String query);
Future<List<Product>> filterByPrice(double minPrice, double maxPrice);
Future<List<Product>> filterByCategory(String category);
Future<void> toggleLike(Product product);
Future<void> addToCart(Product product);
Future<void> increaseQuantity(Product product);
Future<void> decreaseQuantity(Product product);
}
Use Cases (Сценарии использования):
Это задачи, которые нужно выполнить, чтобы дом был построен. Например, «построить стену», «вставить окна», «накрыть крышу». Они определяют пошагово, какие задачи нужны для конечного результата.
import '../entities/product_entity.dart';
import '../repositories/product_repository.dart';
class GetProducts {
final ProductRepository repository;
GetProducts(this.repository);
Future<List<Product>> call() async {
return await repository.getProducts();
}
}
// Use case для поиска продуктов
class SearchProducts {
final ProductRepository repository;
SearchProducts(this.repository);
Future<List<Product>> call(String query) async {
return await repository.searchProducts(query);
}
}
// Use case для фильтрации продуктов по цене
class FilterProductsByPrice {
final ProductRepository repository;
FilterProductsByPrice(this.repository);
Future<List<Product>> call(double minPrice, double maxPrice) async {
return await repository.filterByPrice(minPrice, maxPrice);
}
}
// Use case для фильтрации продуктов по категории
class FilterProductsByCategory {
final ProductRepository repository;
FilterProductsByCategory(this.repository);
Future<List<Product>> call(String category) async {
return await repository.filterByCategory(category);
}
}
// Use case для лайка
class ToggleLikeProduct {
final ProductRepository repository;
ToggleLikeProduct(this.repository);
Future<void> call(Product product) async {
await repository.toggleLike(product);
}
}
class AddToCart {
final ProductRepository repository;
AddToCart(this.repository);
Future<void> call(Product product) async {
await repository.addToCart(product);
}
}
Presentation Layer (Презентация, то, что видит клиент)
Это уровень, где мы показываем готовый дом клиенту.
Screens (Экраны):
Это комнаты в доме, в которые можно войти и посмотреть, как все выглядит. Например, гостиная, спальня, кухня — каждая из которых показывает конечный результат на экране.
Widgets (Виджеты):
Это отдельные элементы в комнатах, которые создают общее впечатление от дома, такие как диваны, столы, картины. Виджеты — это визуальные блоки, из которых состоят экраны.
Bloc (Логика отображения):
Это архитектор, который управляет тем, как элементы появляются на экранах и обновляются при изменениях. Например, если открывается дверь или включается свет, Bloc контролирует, что и как должно измениться для пользователя.
Last updated