326 lines
7.4 KiB
Markdown
326 lines
7.4 KiB
Markdown
# Kapadokya Kuralları: Önce vs Sonra
|
||
|
||
## 📊 Davranış Karşılaştırması
|
||
|
||
### Senaryo 1: Restaurant/Cafe Ekleme
|
||
|
||
#### ❌ ÖNCE (Kurallar Pasif)
|
||
```
|
||
GÜN 1:
|
||
✅ Göreme Açık Hava Müzesi (museum)
|
||
✅ Seten Restaurant (restaurant)
|
||
✅ Cafe Safak (cafe) ← SORUN: Aynı günde hem restaurant hem cafe
|
||
✅ Uçhisar Kalesi (viewpoint)
|
||
```
|
||
|
||
#### ✅ SONRA (Kurallar Aktif)
|
||
```
|
||
GÜN 1:
|
||
✅ Göreme Açık Hava Müzesi (museum)
|
||
✅ Seten Restaurant (restaurant)
|
||
❌ Cafe Safak (cafe) ← REDDEDİLDİ: LIMITED kuralı (günde 1 tane)
|
||
✅ Uçhisar Kalesi (viewpoint)
|
||
```
|
||
|
||
**Sonuç:** Günde sadece 1 restaurant VEYA 1 cafe eklenir.
|
||
|
||
---
|
||
|
||
### Senaryo 2: Hotel Ekleme
|
||
|
||
#### ❌ ÖNCE (Kurallar Pasif)
|
||
```
|
||
GÜN 1:
|
||
✅ Sultan Cave Suites (hotel) ← SORUN: Hotel timeline'da görünüyor
|
||
✅ Göreme Açık Hava Müzesi (museum)
|
||
✅ Seten Restaurant (restaurant)
|
||
```
|
||
|
||
#### ✅ SONRA (Kurallar Aktif)
|
||
```
|
||
GÜN 1:
|
||
❌ Sultan Cave Suites (hotel) ← REDDEDİLDİ: EXCLUDED kuralı
|
||
✅ Göreme Açık Hava Müzesi (museum)
|
||
✅ Seten Restaurant (restaurant)
|
||
|
||
BAŞLANGIÇ NOKTASI:
|
||
📍 Sultan Cave Suites (hotel) ← Sadece başlangıç noktası olarak kullanılır
|
||
```
|
||
|
||
**Sonuç:** Oteller asla timeline'a eklenmez, sadece başlangıç noktası olarak kullanılır.
|
||
|
||
---
|
||
|
||
### Senaryo 3: Aynı Yer Tekrarı
|
||
|
||
#### ❌ ÖNCE (Kurallar Pasif)
|
||
```
|
||
GÜN 1:
|
||
✅ Göreme Açık Hava Müzesi (museum)
|
||
✅ Seten Restaurant (restaurant)
|
||
|
||
GÜN 2:
|
||
✅ Göreme Açık Hava Müzesi (museum) ← SORUN: Aynı müze tekrar eklendi
|
||
✅ Dibek Restaurant (restaurant)
|
||
```
|
||
|
||
#### ✅ SONRA (Kurallar Aktif)
|
||
```
|
||
GÜN 1:
|
||
✅ Göreme Açık Hava Müzesi (museum)
|
||
✅ Seten Restaurant (restaurant)
|
||
|
||
GÜN 2:
|
||
❌ Göreme Açık Hava Müzesi (museum) ← REDDEDİLDİ: Tekrarlama kuralı
|
||
✅ Zelve Açık Hava Müzesi (museum) ← Farklı müze eklendi
|
||
✅ Dibek Restaurant (restaurant)
|
||
```
|
||
|
||
**Sonuç:** Aynı yer farklı günlerde tekrar eklenemez.
|
||
|
||
---
|
||
|
||
### Senaryo 4: Flexible Yerler (Müze/Park)
|
||
|
||
#### ✅ ÖNCE (Kurallar Pasif)
|
||
```
|
||
GÜN 1:
|
||
✅ Göreme Açık Hava Müzesi (museum)
|
||
✅ Zelve Açık Hava Müzesi (museum)
|
||
✅ Paşabağ Vadisi (valley)
|
||
✅ Uçhisar Kalesi (viewpoint)
|
||
```
|
||
|
||
#### ✅ SONRA (Kurallar Aktif)
|
||
```
|
||
GÜN 1:
|
||
✅ Göreme Açık Hava Müzesi (museum)
|
||
✅ Zelve Açık Hava Müzesi (museum) ← FLEXIBLE: Aynı tipten birden fazla olabilir
|
||
✅ Paşabağ Vadisi (valley)
|
||
✅ Uçhisar Kalesi (viewpoint)
|
||
```
|
||
|
||
**Sonuç:** FLEXIBLE yerler için davranış değişmedi (zaten doğru çalışıyordu).
|
||
|
||
---
|
||
|
||
### Senaryo 5: Balon Ekleme
|
||
|
||
#### ✅ ÖNCE (Kurallar Pasif)
|
||
```
|
||
GÜN 1:
|
||
✅ Göreme Açık Hava Müzesi (museum)
|
||
✅ Seten Restaurant (restaurant)
|
||
|
||
GÜN 2:
|
||
✅ Balon Turu (hot_air_balloon) ← Zaten doğru çalışıyordu
|
||
✅ Zelve Açık Hava Müzesi (museum)
|
||
```
|
||
|
||
#### ✅ SONRA (Kurallar Aktif)
|
||
```
|
||
GÜN 1:
|
||
✅ Göreme Açık Hava Müzesi (museum)
|
||
✅ Seten Restaurant (restaurant)
|
||
|
||
GÜN 2:
|
||
✅ Balon Turu (hot_air_balloon) ← FIXED_TIME: Trip başına 1 kez
|
||
✅ Zelve Açık Hava Müzesi (museum)
|
||
```
|
||
|
||
**Sonuç:** Balon kuralı için davranış değişmedi (zaten doğru çalışıyordu).
|
||
|
||
---
|
||
|
||
## 🎯 Kural Kategorileri
|
||
|
||
### FLEXIBLE (Esnek)
|
||
```typescript
|
||
['museum', 'park', 'viewpoint', 'valley', 'historical_site', 'church', 'cave', 'underground_city']
|
||
```
|
||
|
||
**Davranış:**
|
||
- ✅ Günde birden fazla olabilir
|
||
- ✅ Aynı tipten birden fazla yer eklenebilir
|
||
- ✅ Maksimum yer sayısına kadar serbest
|
||
|
||
**Örnek:**
|
||
```
|
||
GÜN 1:
|
||
✅ Göreme Açık Hava Müzesi (museum)
|
||
✅ Zelve Açık Hava Müzesi (museum) ← 2. müze
|
||
✅ Derinkuyu Yeraltı Şehri (underground_city)
|
||
✅ Uçhisar Kalesi (viewpoint)
|
||
```
|
||
|
||
---
|
||
|
||
### LIMITED (Sınırlı)
|
||
```typescript
|
||
['restaurant', 'cafe']
|
||
```
|
||
|
||
**Davranış:**
|
||
- ✅ Günde sadece 1 tane
|
||
- ❌ Restaurant VEYA cafe (ikisi birden olamaz)
|
||
- ✅ Farklı günlerde farklı restaurant/cafe olabilir
|
||
|
||
**Örnek:**
|
||
```
|
||
GÜN 1:
|
||
✅ Seten Restaurant (restaurant)
|
||
❌ Cafe Safak (cafe) ← REDDEDİLDİ
|
||
|
||
GÜN 2:
|
||
✅ Dibek Restaurant (restaurant) ← Farklı gün, farklı restaurant
|
||
```
|
||
|
||
---
|
||
|
||
### EXCLUDED (Hariç)
|
||
```typescript
|
||
['hotel', 'accommodation', 'lodging']
|
||
```
|
||
|
||
**Davranış:**
|
||
- ❌ Asla timeline'a eklenmez
|
||
- ✅ Sadece başlangıç noktası olarak kullanılır
|
||
- ✅ Trip metadata'sında saklanır
|
||
|
||
**Örnek:**
|
||
```
|
||
TIMELINE:
|
||
❌ Sultan Cave Suites (hotel) ← Asla eklenmez
|
||
|
||
BAŞLANGIÇ NOKTASI:
|
||
📍 Sultan Cave Suites (hotel) ← Sadece burada kullanılır
|
||
```
|
||
|
||
---
|
||
|
||
### FIXED_TIME (Sabit Saatli)
|
||
```typescript
|
||
['hot_air_balloon', 'hot-air-balloon']
|
||
```
|
||
|
||
**Davranış:**
|
||
- ✅ Trip başına 1 kez
|
||
- ✅ Tercihen 2. günde (1 günlük seyahatte 1. gün)
|
||
- ✅ Sadece sunrise zaman bloğunda
|
||
- ❌ 2. balon eklenemez
|
||
|
||
**Örnek:**
|
||
```
|
||
GÜN 1:
|
||
✅ Göreme Açık Hava Müzesi (museum)
|
||
|
||
GÜN 2:
|
||
✅ Balon Turu (hot_air_balloon) ← Trip başına 1 kez
|
||
✅ Zelve Açık Hava Müzesi (museum)
|
||
|
||
GÜN 3:
|
||
❌ 2. Balon Turu ← REDDEDİLDİ
|
||
✅ Paşabağ Vadisi (valley)
|
||
```
|
||
|
||
---
|
||
|
||
## 📈 İstatistikler
|
||
|
||
### Önce (Kurallar Pasif)
|
||
- ❌ Günde 2-3 restaurant/cafe eklenebiliyordu
|
||
- ❌ Oteller timeline'a eklenebiliyordu
|
||
- ❌ Aynı yer farklı günlerde tekrar eklenebiliyordu
|
||
- ✅ Balon kuralı çalışıyordu
|
||
- ✅ Flexible yerler çalışıyordu
|
||
|
||
### Sonra (Kurallar Aktif)
|
||
- ✅ Günde sadece 1 restaurant/cafe
|
||
- ✅ Oteller timeline'a eklenmez
|
||
- ✅ Aynı yer tekrar eklenemez
|
||
- ✅ Balon kuralı çalışıyor
|
||
- ✅ Flexible yerler çalışıyor
|
||
|
||
---
|
||
|
||
## 🔍 Kod Karşılaştırması
|
||
|
||
### FLEXIBLE PLACES Bölümü
|
||
|
||
#### ❌ ÖNCE
|
||
```typescript
|
||
for (const place of scoredPlaces) {
|
||
if (dayPlaces.length >= MAX_PER_DAY) break;
|
||
if (usedPlaceIds.has(place.id)) continue;
|
||
if (isHotel(place)) continue;
|
||
if (isRestaurant(place)) continue; // ← Manuel kontrol
|
||
|
||
dayPlaces.push(place);
|
||
usedPlaceIds.add(place.id);
|
||
}
|
||
```
|
||
|
||
#### ✅ SONRA
|
||
```typescript
|
||
for (const place of scoredPlaces) {
|
||
if (dayPlaces.length >= MAX_PER_DAY) break;
|
||
if (usedPlaceIds.has(place.id)) continue;
|
||
if (isHotel(place)) continue;
|
||
|
||
// ✨ KURAL KONTROLÜ: Type-based validation
|
||
if (!isValidForDay(place, dayPlaces, usedPlaceIds, { balloonAdded })) {
|
||
continue; // ← Otomatik kural kontrolü
|
||
}
|
||
|
||
dayPlaces.push(place);
|
||
usedPlaceIds.add(place.id);
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
## 🎓 Öğrenilen Dersler
|
||
|
||
### 1. Type-Based Rules
|
||
- ✅ Her yer tipi için ayrı kurallar
|
||
- ✅ Kategori bazlı davranış
|
||
- ✅ Esnek ve genişletilebilir yapı
|
||
|
||
### 2. Validation Function
|
||
- ✅ Tek bir fonksiyon (`isValidForDay`)
|
||
- ✅ Tüm kuralları kontrol eder
|
||
- ✅ Kolay test edilebilir
|
||
|
||
### 3. Context Passing
|
||
- ✅ `balloonAdded` gibi trip-level state
|
||
- ✅ `dayPlaces` ile gün-level state
|
||
- ✅ `usedPlaceIds` ile trip-level tekrarlama kontrolü
|
||
|
||
---
|
||
|
||
## 🚀 Sonuç
|
||
|
||
### Aktive Edilen Kurallar
|
||
1. ✅ **LIMITED** - Restaurant/Cafe limiti
|
||
2. ✅ **EXCLUDED** - Hotel hariç tutma
|
||
3. ✅ **FLEXIBLE** - Müze/Park esnekliği (zaten çalışıyordu)
|
||
4. ✅ **FIXED_TIME** - Balon kuralı (zaten çalışıyordu)
|
||
5. ✅ **Tekrarlama** - Aynı yer tekrarı önleme (zaten çalışıyordu)
|
||
|
||
### Değişiklik Sayısı
|
||
- **Dosya:** 1 (`/src/db/api.ts`)
|
||
- **Satır:** 4 değişiklik
|
||
- **Import:** 3 yeni fonksiyon/sabit
|
||
- **Validation:** 2 yeni kontrol noktası
|
||
|
||
### Test Durumu
|
||
- ✅ TypeScript tip kontrolü geçti
|
||
- ✅ Lint hataları yok (sadece önceden var olanlar)
|
||
- ⏳ Kullanıcı testleri bekleniyor
|
||
|
||
---
|
||
|
||
**Tarih:** 2025
|
||
**Durum:** ✅ Tamamlandı
|
||
**Versiyon:** 1.0
|