340 lines
13 KiB
Markdown
340 lines
13 KiB
Markdown
# π§ Kapadokya KurallarΔ± - Kritik DΓΌzeltme (GΓΆrsel)
|
||
|
||
## π― Sorun: SMART RESTAURANT Bypass
|
||
|
||
### β ΓNCE (HatalΔ± AkΔ±Ε)
|
||
|
||
```
|
||
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
||
β GΓN 1 - HATA SENARYOSU β
|
||
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
||
|
||
1οΈβ£ FLEXIBLE PLACES
|
||
βββββββββββββββββββββββββββββββββββββββββββββββ
|
||
β GΓΆreme AΓ§Δ±k Hava MΓΌzesi (museum) β
|
||
β β
isValidForDay() β FLEXIBLE β Δ°ZΔ°N β
|
||
βββββββββββββββββββββββββββββββββββββββββββββββ
|
||
|
||
βββββββββββββββββββββββββββββββββββββββββββββββ
|
||
β Cafe Safak (cafe) β
|
||
β β
isValidForDay() β LIMITED β Δ°ZΔ°N β
|
||
β (gΓΌnde henΓΌz LIMITED yok) β
|
||
βββββββββββββββββββββββββββββββββββββββββββββββ
|
||
|
||
βββββββββββββββββββββββββββββββββββββββββββββββ
|
||
β PaΕabaΔ Vadisi (valley) β
|
||
β β
isValidForDay() β FLEXIBLE β Δ°ZΔ°N β
|
||
βββββββββββββββββββββββββββββββββββββββββββββββ
|
||
|
||
dayPlaces = [GΓΆreme, Cafe Safak, PaΕabaΔ]
|
||
|
||
2οΈβ£ SMART RESTAURANT
|
||
hasRestaurant = dayPlaces.some(isRestaurant)
|
||
= dayPlaces.some(p => p.type === 'restaurant' || p.type === 'cafe')
|
||
= true (Cafe Safak var)
|
||
|
||
β SORUN: hasRestaurant kontrolΓΌ yanlΔ±Ε!
|
||
- Cafe var ama hasRestaurant = false olarak hesaplanΔ±yor
|
||
- ΓΓΌnkΓΌ isRestaurant fonksiyonu cafe'yi de kontrol ediyor
|
||
- AMA eΔer cafe FLEXIBLE PLACES'te eklenmiΕse...
|
||
|
||
β ASIL SORUN: isValidForDay() kontrolΓΌ YOK!
|
||
|
||
βββββββββββββββββββββββββββββββββββββββββββββββ
|
||
β Seten Restaurant (restaurant) β
|
||
β β DOΔRUDAN EKLENDΔ° (kural kontrolΓΌ yok!) β
|
||
β β LIMITED kuralΔ± bypass edildi! β
|
||
βββββββββββββββββββββββββββββββββββββββββββββββ
|
||
|
||
dayPlaces = [GΓΆreme, Seten Restaurant, Cafe Safak, PaΕabaΔ]
|
||
β Ortaya eklendi (splice)
|
||
|
||
β SONUΓ: AynΔ± gΓΌnde hem cafe hem restaurant var!
|
||
```
|
||
|
||
### β
SONRA (DΓΌzeltilmiΕ AkΔ±Ε)
|
||
|
||
```
|
||
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
||
β GΓN 1 - DOΔRU SENARYO β
|
||
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
||
|
||
1οΈβ£ FLEXIBLE PLACES
|
||
βββββββββββββββββββββββββββββββββββββββββββββββ
|
||
β GΓΆreme AΓ§Δ±k Hava MΓΌzesi (museum) β
|
||
β β
isValidForDay() β FLEXIBLE β Δ°ZΔ°N β
|
||
βββββββββββββββββββββββββββββββββββββββββββββββ
|
||
|
||
βββββββββββββββββββββββββββββββββββββββββββββββ
|
||
β Cafe Safak (cafe) β
|
||
β β
isValidForDay() β LIMITED β Δ°ZΔ°N β
|
||
β (gΓΌnde henΓΌz LIMITED yok) β
|
||
βββββββββββββββββββββββββββββββββββββββββββββββ
|
||
|
||
βββββββββββββββββββββββββββββββββββββββββββββββ
|
||
β PaΕabaΔ Vadisi (valley) β
|
||
β β
isValidForDay() β FLEXIBLE β Δ°ZΔ°N β
|
||
βββββββββββββββββββββββββββββββββββββββββββββββ
|
||
|
||
dayPlaces = [GΓΆreme, Cafe Safak, PaΕabaΔ]
|
||
|
||
2οΈβ£ SMART RESTAURANT
|
||
hasRestaurant = dayPlaces.some(isRestaurant)
|
||
= true (Cafe Safak var)
|
||
|
||
β
hasRestaurant = true β SMART RESTAURANT atlandΔ±
|
||
|
||
VEYA (eΔer cafe yoksa):
|
||
|
||
hasRestaurant = false
|
||
|
||
βββββββββββββββββββββββββββββββββββββββββββββββ
|
||
β Seten Restaurant (restaurant) β
|
||
β β
isValidForDay() kontrolΓΌ: β
|
||
β - dayPlaces'te LIMITED var mΔ±? β
|
||
β - EVET (Cafe Safak) β
|
||
β - return false β
|
||
β β REDDEDΔ°LDΔ° (LIMITED kuralΔ±) β
|
||
βββββββββββββββββββββββββββββββββββββββββββββββ
|
||
|
||
dayPlaces = [GΓΆreme, Cafe Safak, PaΕabaΔ]
|
||
(deΔiΕmedi)
|
||
|
||
β
SONUΓ: GΓΌnde sadece 1 LIMITED tip (cafe)
|
||
```
|
||
|
||
## π Kod KarΕΔ±laΕtΔ±rmasΔ±
|
||
|
||
### β ΓNCE (SatΔ±r 1066-1069)
|
||
|
||
```typescript
|
||
if (restaurants.length > 0) {
|
||
dayPlaces.splice(1, 0, restaurants[0]); // β DoΔrudan ekleniyor
|
||
usedPlaceIds.add(restaurants[0].id); // β Kural kontrolΓΌ yok
|
||
}
|
||
```
|
||
|
||
**Sorun:**
|
||
- Restaurant doΔrudan ekleniyor
|
||
- `isValidForDay()` kontrolΓΌ yok
|
||
- LIMITED kuralΔ± bypass ediliyor
|
||
|
||
### β
SONRA (SatΔ±r 1066-1073)
|
||
|
||
```typescript
|
||
if (restaurants.length > 0) {
|
||
const restaurant = restaurants[0];
|
||
|
||
// β¨ KURAL KONTROLΓ: Type-based validation (LIMITED rule)
|
||
if (isValidForDay(restaurant, dayPlaces, usedPlaceIds, { balloonAdded })) {
|
||
dayPlaces.splice(1, 0, restaurant); // β
Kural kontrolΓΌnden sonra
|
||
usedPlaceIds.add(restaurant.id); // β
Sadece geΓ§erliyse ekle
|
||
}
|
||
}
|
||
```
|
||
|
||
**DΓΌzeltme:**
|
||
- Restaurant ΓΆnce deΔiΕkene atanΔ±yor
|
||
- `isValidForDay()` ile kontrol ediliyor
|
||
- Sadece geΓ§erliyse ekleniyor
|
||
|
||
## π isValidForDay() DetaylΔ± AkΔ±Ε
|
||
|
||
```
|
||
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
||
β isValidForDay(restaurant, dayPlaces, ...) β
|
||
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
||
β
|
||
βΌ
|
||
βββββββββββββββββββββββββ
|
||
β 1οΈβ£ TEKRARLAMA KONTROLΓβ
|
||
β usedPlaceIds.has(id)? β
|
||
βββββββββββββββββββββββββ
|
||
β β
|
||
β HAYIR β EVET
|
||
βΌ βΌ
|
||
ββββββββ ββββββββ
|
||
β Devamβ β β β
|
||
ββββββββ βREDDETβ
|
||
β ββββββββ
|
||
βΌ
|
||
βββββββββββββββββββββββββ
|
||
β 2οΈβ£ KATEGORΔ° BELΔ°RLE β
|
||
β getPlaceCategory β
|
||
β ('restaurant') β
|
||
β β 'LIMITED' β
|
||
βββββββββββββββββββββββββ
|
||
β
|
||
βΌ
|
||
βββββββββββββββββββββββββ
|
||
β 3οΈβ£ LIMITED KONTROLΓ β
|
||
β dayPlaces'te LIMITED β
|
||
β var mΔ±? β
|
||
βββββββββββββββββββββββββ
|
||
β β
|
||
β HAYIR β EVET
|
||
βΌ βΌ
|
||
ββββββββ ββββββββ
|
||
β β
β β β β
|
||
βΔ°ZΔ°N β βREDDETβ
|
||
ββββββββ ββββββββ
|
||
```
|
||
|
||
## π― GerΓ§ek DΓΌnya ΓrneΔi
|
||
|
||
### Senaryo: 2 GΓΌnlΓΌk Kapadokya Turu
|
||
|
||
#### β ΓNCE (HatalΔ±)
|
||
|
||
```
|
||
GΓN 1:
|
||
09:00 - GΓΆreme AΓ§Δ±k Hava MΓΌzesi (museum)
|
||
12:00 - Cafe Safak (cafe) β FLEXIBLE PLACES'ten
|
||
13:00 - Seten Restaurant (restaurant) β SMART RESTAURANT'tan (HATA!)
|
||
15:00 - PaΕabaΔ Vadisi (valley)
|
||
|
||
β SORUN: AynΔ± gΓΌnde hem cafe hem restaurant!
|
||
β LIMITED kuralΔ± ihlal edildi!
|
||
|
||
GΓN 2:
|
||
09:00 - Zelve AΓ§Δ±k Hava MΓΌzesi (museum)
|
||
12:00 - Dibek Restaurant (restaurant) β SMART RESTAURANT'tan
|
||
15:00 - Devrent Vadisi (valley)
|
||
```
|
||
|
||
#### β
SONRA (DoΔru)
|
||
|
||
```
|
||
GΓN 1:
|
||
09:00 - GΓΆreme AΓ§Δ±k Hava MΓΌzesi (museum)
|
||
12:00 - Cafe Safak (cafe) β FLEXIBLE PLACES'ten
|
||
15:00 - PaΕabaΔ Vadisi (valley)
|
||
17:00 - UΓ§hisar Kalesi (viewpoint)
|
||
|
||
β
DOΔRU: GΓΌnde sadece 1 LIMITED tip (cafe)
|
||
β
Restaurant reddedildi (LIMITED kuralΔ±)
|
||
|
||
GΓN 2:
|
||
09:00 - Zelve AΓ§Δ±k Hava MΓΌzesi (museum)
|
||
12:00 - Dibek Restaurant (restaurant) β SMART RESTAURANT'tan
|
||
15:00 - Devrent Vadisi (valley)
|
||
17:00 - Avanos Seramik (workshop)
|
||
|
||
β
DOΔRU: GΓΌnde sadece 1 LIMITED tip (restaurant)
|
||
```
|
||
|
||
## π Etki Analizi
|
||
|
||
### Γnce (HatalΔ±)
|
||
|
||
| GΓΌn | Cafe | Restaurant | LIMITED SayΔ±sΔ± | Durum |
|
||
|-----|------|------------|----------------|-------|
|
||
| 1 | β
| β
| 2 | β HATA |
|
||
| 2 | β | β
| 1 | β
DoΔru |
|
||
|
||
**Sorun:** GΓΌn 1'de LIMITED kuralΔ± ihlal ediliyor
|
||
|
||
### Sonra (DoΔru)
|
||
|
||
| GΓΌn | Cafe | Restaurant | LIMITED SayΔ±sΔ± | Durum |
|
||
|-----|------|------------|----------------|-------|
|
||
| 1 | β
| β | 1 | β
DoΔru |
|
||
| 2 | β | β
| 1 | β
DoΔru |
|
||
|
||
**SonuΓ§:** Her gΓΌnde LIMITED kuralΔ± uygulanΔ±yor
|
||
|
||
## π§ͺ Test Matrisi
|
||
|
||
| Test | FLEXIBLE PLACES | SMART RESTAURANT | SonuΓ§ |
|
||
|------|----------------|------------------|-------|
|
||
| Cafe eklendi | β
Cafe | β Restaurant reddedildi | β
DoΔru |
|
||
| Restaurant eklendi | β
Restaurant | β AtlandΔ± (hasRestaurant=true) | β
DoΔru |
|
||
| HiΓ§biri eklenmedi | β | β
Restaurant eklendi | β
DoΔru |
|
||
| Δ°kisi de aday | β
Cafe (ΓΆnce geldi) | β Restaurant reddedildi | β
DoΔru |
|
||
|
||
## π Kritik Noktalar
|
||
|
||
### 1. hasRestaurant KontrolΓΌ Yeterli DeΔil
|
||
|
||
```typescript
|
||
const hasRestaurant = dayPlaces.some(isRestaurant);
|
||
```
|
||
|
||
**Sorun:**
|
||
- Sadece restaurant/cafe var mΔ± kontrol eder
|
||
- LIMITED kategorisini kontrol etmez
|
||
- Gelecekte yeni LIMITED tipler eklenirse Γ§alΔ±Εmaz
|
||
|
||
**ΓΓΆzΓΌm:**
|
||
- `isValidForDay()` kategori bazlΔ± kontrol yapar
|
||
- TΓΌm LIMITED tipleri kapsar
|
||
- GeniΕletilebilir yapΔ±
|
||
|
||
### 2. TΓΌm Ekleme NoktalarΔ±nda Kontrol Gerekli
|
||
|
||
```
|
||
β
BALLOON β shouldAddBalloon()
|
||
β
FLEXIBLE β isValidForDay()
|
||
β
SMART REST β isValidForDay() (YENΔ°!)
|
||
β
MIN FILL β isValidForDay()
|
||
```
|
||
|
||
**Γnemli:**
|
||
- Bir yer timeline'a eklendiΔi HER noktada kontrol gerekli
|
||
- HiΓ§bir bypass noktasΔ± bΔ±rakΔ±lmamalΔ±
|
||
- TutarlΔ± kural uygulamasΔ± Εart
|
||
|
||
### 3. Kod DeΔiΕikliΔi Minimal
|
||
|
||
```diff
|
||
if (restaurants.length > 0) {
|
||
+ const restaurant = restaurants[0];
|
||
+
|
||
+ // β¨ KURAL KONTROLΓ
|
||
+ if (isValidForDay(restaurant, dayPlaces, usedPlaceIds, { balloonAdded })) {
|
||
- dayPlaces.splice(1, 0, restaurants[0]);
|
||
- usedPlaceIds.add(restaurants[0].id);
|
||
+ dayPlaces.splice(1, 0, restaurant);
|
||
+ usedPlaceIds.add(restaurant.id);
|
||
+ }
|
||
}
|
||
```
|
||
|
||
**Avantajlar:**
|
||
- Minimal deΔiΕiklik (5 satΔ±r)
|
||
- Mevcut yapΔ±ya uyumlu
|
||
- Test edilmiΕ fonksiyon kullanΔ±mΔ±
|
||
|
||
## β
DoΔrulama
|
||
|
||
### TΓΌm Ekleme NoktalarΔ±
|
||
|
||
```bash
|
||
$ grep -n "dayPlaces.push\|dayPlaces.splice" src/db/api.ts
|
||
|
||
1021: dayPlaces.push(balloon); # β
shouldAddBalloon()
|
||
1038: dayPlaces.push(place); # β
isValidForDay()
|
||
1071: dayPlaces.splice(1, 0, restaurant);# β
isValidForDay() (YENΔ°!)
|
||
1090: dayPlaces.push(p); # β
isValidForDay()
|
||
```
|
||
|
||
### TΓΌm Kural Kontrolleri
|
||
|
||
```bash
|
||
$ grep -n "isValidForDay\|shouldAddBalloon" src/db/api.ts
|
||
|
||
1006: shouldAddBalloon(...) # β
BALLOON
|
||
1034: isValidForDay(place, ...) # β
FLEXIBLE PLACES
|
||
1070: isValidForDay(restaurant, ...) # β
SMART RESTAURANT (YENΔ°!)
|
||
1086: isValidForDay(p, ...) # β
MIN FILL
|
||
```
|
||
|
||
β
**SonuΓ§:** TΓΌm ekleme noktalarΔ±nda kural kontrolΓΌ var!
|
||
|
||
---
|
||
|
||
**Tarih:** 2025
|
||
**Durum:** β
DΓΌzeltildi
|
||
**DeΔiΕiklik:** 1 dosya, 5 satΔ±r
|
||
**Etki:** Kritik - LIMITED kuralΔ± artΔ±k tam olarak Γ§alΔ±ΕΔ±yor
|