Python'da alt ve üst sınır değerleri test etme
Kod işlevselliği
Aşağıdaki kod, bir kullanıcının iki özellikte alt sınır ve üst sınır için belirlediği değerlerin olup olmadığını test eder:
- Alt sınır, üst sınırdan daha küçüktür.
- Değerler 0'dan (pozitif) büyük.
İlk önce alt sınırın üst sınırdan daha küçük olup olmadığını kontrol ettiğinden, alt sınırın 0'dan büyük olup olmadığını test ederse üst sınırın 0'dan büyük olduğunu örtük olarak doğrular. Bu nedenle, benim düşüncem şudur: Kodu daha fazla yapabilirim "0'dan büyük üst sınırdır" denetimini atlayarak sıkıştırın.
Kod
# Object getting labels
class Get_labels:
def __init__(self,lower_bound,upper_bound,configuration_name):
self.lower_bound = lower_bound
self.upper_bound = upper_bound
self.configuration_name = configuration_name
self.check_threshold_validity()
# Verifies if the chosen thresholds are valid values.
def check_threshold_validity(self):
if self.lower_bound>=self.upper_bound:
raise Exception(f'Sorry, the lower threshold={self.lower_bound} should be smaller than the upper bound={self.upper_bound} for configuration={self.configuration_name}')
# checks if lower bound (and implicitly upper bound) are above zero
if self.lower_bound<=0:
raise Exception(f'Sorry, the lower threshold={self.lower_bound} should be larger than 0 for configuration={self.configuration_name}')
if __name__ == '__main__':
get_labels = Get_labels(-1,25,"first")
Tasarım seçimi
Bununla birlikte, eğer kod değiştirilirse, üst sınırın da kontrol edilmesi gerektiği açık olmayabilir çünkü bu örtülü olarak yapılır. Bu, üst sınırın sıfırın altında olduğu kenar durumunun modifikasyonlardan sonra yakalanmamasıyla sonuçlanabilir. Dolayısıyla bu senaryoyu önlemek için, aşağıdakiler için bir hata oluşup oluşmadığını kontrol eden iki birimlik test uygulayabilirim:
- Alt sınır negatif, üst sınır negatif
- Alt sınır sıfır, üst sınır negatif
- Alt sınır pozitif, üst sınır negatif
Soru
Birim testlerinde test edilmiş olsa bile, yine de ana koda açık kontrolün dahil edilmesi tavsiye ediliyor mu?
Yanıtlar
Olağandışı durumlar dışında, sınıflar nesneler veya varlıklardır - dolayısıyla nesneler terimi - işlevler veya yöntemler eylemler veya işlemlerdir. Onları buna göre adlandırmak istiyorsunuz. Bu nedenle, Get_labelsgarip bir şekilde adlandırılmış bir sınıf olarak beni etkiliyor. Bize gösterdiklerinize dayanarak, Boundsalternatif olarak adı önerebilirim . Bu ismin bir yan yararı, öznitelik adlarını anlam kaybı olmadan kısaltmanıza izin vermesidir.
Sınırların temel geçerliliğini kontrol etmek için ayrı bir yöntem, bana aşırı mühendislik gibi görünüyor - kontrol mantığı çok daha karmaşık hale gelmedikçe veya kodun başka bir yerinde kullanılmadıkça. Yani __init__()bu durumda basit bir doğrulama yapardım .
Kodunuzda konuşkan veya ayrıntılı mesajlar kullanma eğiliminden kaçının. Uzun vadede size veya kullanıcılarınıza yardımcı olmayacak - en azından bu benim deneyimim. Her şeyi doğrudan ve titizlikle kısa tutun. Aslında, mesajların biçimsel yönelimlerinde doğal olmaktan ziyade çok teknik tutulması genellikle faydalıdır. Bununla kastettiğim, problemi bir insanın sözlü olarak bir insana nasıl tanımlayabileceğidir ("1000 olan alt sınır, üst sınırdan daha küçük olmalıdır, ki 125"), genellikle daha iyi tanımlayabilirsiniz. problemi formülsel, şematik, bilgisayar benzeri bir şekilde. Diğer şeylerin yanı sıra, bu yaklaşım, bir uygulamadaki tüm hata mesajları için geleneksel bir format benimsemenizi sağlar. Aşağıdaki yeniden yazmada gösterilen hata mesajı formatı genel olarak şu şekilde açıklanabilir PROBLEM: SELF. Tutarlı bir yaklaşım, ilk etapta doğrulama kodunu yazmayı ve zaman içinde korumayı kolaylaştırır. Tutarlılık, kullanıcılara profesyonelliği de aktarır.
Bu satırlar boyunca __repr__(), aşağıda gösterildiği gibi, öncelikle sınıfınız için tanımlayarak bu tür doğrulama mesajlarının oluşturulmasını genellikle basitleştirebilirsiniz .
Şimdiye kadar sahip olduğunuz doğrulamalar için a ValueError, general yetiştirmekten daha yakındır Exception. Ayrıca, diğer türdeki hataları da kontrol etmeyi düşünebilirsiniz: örneğin, sınırlar yalnızca tamsayılarla mı sınırlıdır?
Bunu kontrol ederseniz, bir TypeError.
Son olarak, stilistik ve kuşkusuz öznel bir ince nokta. Aşağıda, kodunuzdan yazıldığı gibi bir yığın izlemesi verilmiştir. Ayrıntılı mesajı önce bir f-string olarak ve sonra parametreler doldurulmuş olarak iki kez görüyoruz. Bunun nesi yanlış? Ciddi bir şey değil, ama ağır, sıkıcı, hatta belli bir zarafetten yoksun. En azından, ayrıntılı mesajın tekrarlanmasının kullanıcıya biraz dikkat dağıttığı ve ne olduğunu anlamak için kullanıcıya fazladan bir görsel veya bilişsel yük getirdiği söylenebilir. Bunu, revize edilmiş koddaki yığın izleme ile karşılaştırın.
# ORIGINAL.
Traceback (most recent call last):
File "bounds.py", line 19, in <module>
get_labels = Get_labels(-1,25,"first")
File "bounds.py", line 7, in __init__
self.check_threshold_validity()
File "bounds.py", line 17, in check_threshold_validity
raise Exception(f'Sorry, the lower threshold={self.lower_bound} should be larger than 0 for configuration={self.configuration_name}')
Exception: Sorry, the lower threshold=-1 should be larger than 0 for configuration=first
# REVISED.
Traceback (most recent call last):
File "bounds.py", line 72, in <module>
b1 = Bounds(1000, 125, 'first')
File "bounds.py", line 67, in __init__
raise Exception(msg)
Exception: Upper bound must be greater than lower: Bounds(1000, 125, first)
Göz önünde bulundurmanız için bazı olası düzenlemelerle kodlayın:
class Bounds:
def __init__(self, lower, upper, name):
self.lower = lower
self.upper = upper
self.name = name
if lower <= 0 or upper <= 0:
msg = f'Bounds must be positive: {self}'
raise ValueError(msg)
if upper <= lower:
msg = f'Upper bound must be greater than lower: {self}'
raise ValueError(msg)
def __repr__(self):
return f'Bounds({self.lower}, {self.upper}, {self.name!r})'