TGViewer
DON'T STOP AND CODE DON'T STOP AND CODE @start_py · 100 subscribers
Post #561 133
[Entity и Value Object в DDD]

Привет! В DDD сразу встречаешь два ключевых понятия — Entity и Value Object. Оба вроде как про данные, но ведут себя по-разному.

Что такое `Entity`?
Entity — это объект, который имеет уникальный идентификатор и жизненный цикл. Его идентичность важна, и она сохраняется на протяжении всего времени существования объекта. Например, пользователь в системе (User) — это Entity, потому что у него есть уникальный ID, и даже если его имя или email изменятся, это все равно будет тот же самый пользователь.

from dataclasses import dataclass, field
import uuid

@dataclass
class User:
name: str
email: str
id: uuid.UUID = field(default_factory=uuid.uuid4, init=False)

def __eq__(self, other):
if isinstance(other, User):
return self.id == other.id
return False

# Пример использования:
user1 = User("Иван", "ivan@example.com")
user2 = User("Иван", "ivan@example.com")

print(user1) # User(name='Иван', email='ivan@example.com', id=...)
print(user2) # User(name='Иван', email='ivan@example.com', id=...)
print(user1 == user2) # False, потому что ID разные


Что такое `Value Object`?
Value Object, в отличие от Entity, не имеет идентичности. Он определяется своими атрибутами, и если все атрибуты одинаковы, то два Value Object считаются равными. Value Object обычно неизменяемы (immutable), что делает их более предсказуемыми и безопасными в использовании.

from dataclasses import dataclass
import re

@dataclass(frozen=True)
class EmailAddress:
value: str

def __post_init__(self):
if not self._is_valid_email(self.value):
raise ValueError(f"Некорректный email: {self.value}")

@staticmethod
def _is_valid_email(email: str) -> bool:
pattern = r"^[\w\.-]+@[\w\.-]+\.\w+$"
return re.match(pattern, email) is not None

# Пример использования:
try:
email1 = EmailAddress("valid.email@example.com")
print(email1) # EmailAddress(value='valid.email@example.com')

email2 = EmailAddress("invalid-email") # Ошибка валидации!
except ValueError as e:
print(e)


Когда что использовать?
- Если объект уникален сам по себе — это Entity.
- Если важны только его значения — это Value Object.

Фишка DDD:
Хорошая практика — делать Value Objects иммутабельными и использовать их для инкапсуляции логики. Например, не просто string для email, а EmailAddress, который сразу валидирует значение.

Entity и Value Object — это мощные концепции, которые помогают структурировать код и делать его более предсказуемым. В Python их реализация может быть элегантной с использованием dataclasses.

#DDD #Python #Entity #ValueObject #Программирование
  • 🔥 6
More from @start_py
  1. Sep 25, 2026[Скорость моделей] Стал обращать исключительное внимание в работе на скорость ответа ии-мо…
  2. Aug 16, 2026[Санкции] Failed to load URL https://www.nvidia.com/ru-ru/geforce/billboards/displaydriver…
  3. Jul 29, 2026[Будни вайбкодера. Или как ИИ не мог выключить проверку SSL] Сейчас была очередная забавна…
  4. Jul 20, 2026[Про впн, прокси и первый опыт с живыми пользователями] Этой весной, когда начались массов…
  5. Jul 7, 2026Наше время ограничено. "На экзистенциальном уровне :) у нас не так уж и много времени на э…
  6. Jul 2, 2026"если вам нужно прочитать исходный код функции, чтобы понять, что она делает (в частности,…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →