Aşağıdaki kodu göz önünde bulundurun:
public void doSomething(int input)
{
while(true)
{
TransformInSomeWay(input);
if(ProcessingComplete(input))
break;
DoSomethingElseTo(input);
}
}
Bu sürecin sınırlı fakat girdi bağımlı bir adım içerdiğini varsayalım; döngü, algoritmanın bir sonucu olarak kendiliğinden sona erecek şekilde tasarlanmıştır ve süresiz olarak çalışacak şekilde tasarlanmamıştır (bir dış olay tarafından iptal edilinceye kadar). Döngünün bitip bitmeyeceğini görmek için yapılan test mantıklı bir adım kümesinin ortasında olduğundan, while döngüsü şu anda anlamlı bir şeyi kontrol etmemektedir; Bunun yerine kontrol, kavramsal algoritma içindeki "uygun" yerde gerçekleştirilir.
Bunun kötü bir kod olduğu söylendi çünkü döngü koşulu tarafından kontrol edilmeyen son koşul nedeniyle hataya daha açık. Döngüyü nasıl terk edeceğinizi anlamak daha zor ve kırılma koşulu gelecekteki değişiklikler nedeniyle yanlışlıkla atlanabileceği veya atlanabileceği için böcekleri davet edebilir.
Şimdi, kod aşağıdaki gibi yapılandırılabilir:
public void doSomething(int input)
{
TransformInSomeWay(input);
while(!ProcessingComplete(input))
{
DoSomethingElseTo(input);
TransformInSomeWay(input);
}
}
Ancak bu, DRY'yi ihlal eden, koddaki bir yönteme yapılan bir çağrıyı çoğaltır; Eğer TransformInSomeWay
daha sonra başka bir metod ile ikame edilmiştir, iki arama bulunan ve değiştirilmiş (ve kod daha karmaşık bir parça daha az belirgin olabilir iki olduğu gerçeği) olması gerekir.
Ayrıca şöyle yazabilirsiniz:
public void doSomething(int input)
{
var complete = false;
while(!complete)
{
TransformInSomeWay(input);
complete = ProcessingComplete(input);
if(!complete)
{
DoSomethingElseTo(input);
}
}
}
... ama şimdi tek amacı koşul kontrolünü döngü yapısına kaydırmak olan ve aynı zamanda orijinal mantıkla aynı davranışı sağlamak için birçok kez kontrol edilmesi gereken bir değişkene sahipsin.
Bana göre, bu kodun gerçek dünyada uyguladığı algoritma göz önüne alındığında, orijinal kodun en okunaklı olduğunu söylüyorum. Kendin içinden geçiyor olsaydın, böyle düşünürdün ve algoritmaya aşina insanlar için sezgisel olurdu.
Peki hangisi "daha iyi"? mantığın döngü çevresinde yapılandırılmasıyla durum döngüsünün durum döngüsünün sorumluluğunu vermek daha iyi olur mu? Yoksa, mantığın gereklilikleri veya algoritmanın kavramsal bir tanımını belirtildiği gibi "doğal" bir şekilde yapılandırması daha iyi midir, bu döngünün yerleşik yeteneklerini atlamak anlamına gelebilir mi?
do ... until
Onlar olmak zorunda olmadığı için yapı da döngüler bu tür için yararlıdır "astarlanmış."