Randevu çakışması: sadece başlangıç saatine bakma
Bir randevu sisteminde çakışma kontrolü nasıl yapılır sorusunun doğru cevabı, sık yapılan hatadan bir adım uzakta. Yaygın hata: yeni randevunun başlangıç saatinin, mevcut randevularla çakışıp çakışmadığına sadece başlangıç zamanına bakarak karar vermek. Bu, yeni randevu bir mevcut randevunun ortasına denk gelirse çakışmayı kaçırır.
Doğru desen, iki aralığın klasik kesişim formülü:
var isAvailable = !appointments.Any(a =>
(a.StartTime < slotEnd && a.EndTime > currentTime));
Mantık şu: iki aralık kesişmiyorsa ya biri tamamen diğerinden önce biter, ya tamamen sonra başlar. Bunun DEĞİLİ (birinin başlangıcı diğerinin bitişinden önce VE bitişi diğerinin başlangıcından sonra) kesişme durumunu yakalıyor. Sadece “yeni randevunun başlangıcı, var olan bir randevunun içinde mi” diye sormak yeterli değil; “var olan bir randevunun başlangıcı, yeni randevunun içinde mi” durumunu da kaçırmamak gerekiyor — formül ikisini de tek ifadede kapsıyor.
Müsait saat üretimi de aynı mantığı tekrar kullanıyor: hekimin çalışma programına göre gün dilimlere bölünüyor, her dilim mevcut randevularla bu formülle karşılaştırılıyor.
Bunu neden önemsiyorum: interval-overlap bir CS 101 konusu ama takvim, rezervasyon, randevu içeren her sistemde tekrar tekrar karşınıza çıkıyor. Doğru yazıldığında tek satır, yanlış yazıldığında üretimde ancak belirli saatlerde ortaya çıkan, tekrarlanması zor bir bug oluyor.