Summary Files Commits Branches @commit @diff @stats
path: root / src / teaching / oop-2025 / week15 / index.du
blob: 09e7a90f2f8bfb96e8e5c31798421acfebd941cf (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
# Задачи - ООП, Седмица 15, 03.06.2026

'define expected-reading 3 min
'define created 03 June 2026
'define edited 03 June 2026
[$pagenav]

## За решаване

### Задача

Ще създадем система за създаване на постове от потребители, нещо подобно на Facebook/Reddit/...

Реализирайте шаблонен клас [`Database`], който съхранява неограничено количество от обекти от тип [`T`] с идентификатор от тип [`K`].
На всеки обект може да съответства един [*уникален*] идентификатор.
За тип [`K`] можем да допуснем единствено, че поддържа [`operator==`].

В [`Database`] трябва да може да се добавят и премахват елементи, спрямо даден идентификатор.
Нека тези член-функции да връщат [`bool`], спрямо това дали операцията е успешна.

Реализирайте клас [`User`], който въхранява имейл, потребителско име и парола.
.bulleted
- Имейла трябва да е в [url https://en.wikipedia.org/wiki/Email_address#Syntax коректен формат] (не е нужно 100% покритие на всички изисквания, но поне по-значимите ограничения да се проверяват).
- Потребителското име може да съдържа латински бувки, цифри, тире и долна черта, като не може да започва с тире или цифра.
- Паролата трябва да бъде поне 8 знака и да съдържа поне една цифра, една буква и един специален знак (нито цифра, нито буква)

Реализирайте клас [`Post`], който съхранява идентификатор на потребител (какъв е типа на този идентификатор ще бъде описано по-късно), текстово съдържание с неограничен размер и контейнер с идентификатори на всички потребители, които са харесали поста.

Реализирайте клас [`PostSystem`], който съхранява колекции от потребители и постове (използвайки [`Database`]), като е шаблонен спрямо типа на идентификатора на потребителя.
Трябва да поддържа методи за регистриране на нов потребител, изтриване на акаунт, влизане в акаунт и излизане от акаунт.

При влизане в акаунт, системата връща "токен" от тип [`A`], който се използва за всички операции, където е нужна информация на съществуващ потребител.
Разбира се, всеки токен се пази в [`PostSystem`] и при потребителска операция се прави сравнение дали токена съответства на потребителя.
При влизане в акаунт се проверява дали генерирания токен съществува, и ако да, тогава влизането се отказва.

За тип [`A`] единствено можем да допуснем, че поддържа [`operator==`].
Понеже не знаем типа и следователно не знаем как да се генерира токена, член-функцията за генериране не може да има реализация.

Освен тези операции, влязъл потребител може да създаде пост, да изтрие пост и да маркира/отмаркира пост като харесан.

Реализирайте наследник [`SecureForum`], където потребителските идентификатори и токени са целочислени неотрицателни поне 16-битови числа.
Всеки потребител си има единствен токен след влизане в акаунта (т.е. може да влезе в акаунта само ако е излязъл).

Реализирайте наследник [`StandardForum`], където потребителския идентификатор е целочислено неотрицателно число и токена е низ.
Има неограничено количество токени за всеки потребител