ปัญหาหลักของ NULL คือทำให้ระบบไม่น่าเชื่อถือ ใน 1,980 Tony Hoare ในกระดาษทุ่มเทเพื่อรางวัลทัวริงของเขาเขียนว่า:
ดังนั้นคำแนะนำที่ดีที่สุดของฉันที่มีต่อผู้สร้างและนักออกแบบของ ADA นั้นก็ถูกเพิกเฉย ... ไม่อนุญาตให้ใช้ภาษานี้ในสถานะปัจจุบันในแอปพลิเคชั่นที่ความน่าเชื่อถือมีความสำคัญเช่นสถานีพลังงานนิวเคลียร์ขีปนาวุธล่องเรือระบบเตือนภัยล่วงหน้าระบบป้องกันขีปนาวุธต่อต้านเชื้อแบคทีเรีย จรวดต่อไปที่จะหลงทางเนื่องจากข้อผิดพลาดของภาษาการเขียนโปรแกรมอาจไม่ใช่จรวดอวกาศเชิงสำรวจในการเดินทางไปดาวศุกร์โดยไม่เป็นอันตราย: มันอาจเป็นหัวรบนิวเคลียร์ที่ระเบิดในเมืองใดเมืองหนึ่งของเรา ภาษาโปรแกรมที่ไม่น่าเชื่อถือซึ่งสร้างโปรแกรมที่ไม่น่าเชื่อถือนั้นมีความเสี่ยงต่อสภาพแวดล้อมและสังคมของเรามากกว่ารถยนต์ที่ไม่ปลอดภัยยาฆ่าแมลงที่เป็นพิษหรืออุบัติเหตุที่สถานีพลังงานนิวเคลียร์ ระมัดระวังเพื่อลดความเสี่ยงไม่เพิ่มขึ้น
ภาษา ADA มีการเปลี่ยนแปลงมากมายตั้งแต่นั้นอย่างไรก็ตามปัญหาดังกล่าวยังคงมีอยู่ใน Java, C # และภาษายอดนิยมอื่น ๆ อีกมากมาย
มันเป็นหน้าที่ของนักพัฒนาในการสร้างสัญญาระหว่างลูกค้าและซัพพลายเออร์ ตัวอย่างเช่นใน C # เช่นเดียวกับใน Java คุณสามารถใช้Generics
เพื่อลดผลกระทบของNull
การอ้างอิงโดยการสร้างแบบอ่านอย่างเดียวNullableClass<T>
(สองตัวเลือก):
class NullableClass<T>
{
public HasValue {get;}
public T Value {get;}
}
แล้วใช้มันเป็น
NullableClass<Customer> customer = dbRepository.GetCustomer('Mr. Smith');
if(customer.HasValue){
// one logic with customer.Value
}else{
// another logic
}
หรือใช้สองสไตล์ตัวเลือกด้วยวิธีการขยาย C #:
customer.Do(
// code with normal behaviour
,
// what to do in case of null
)
ความแตกต่างมีความสำคัญ ในฐานะลูกค้าของวิธีการที่คุณรู้ว่าสิ่งที่คาดหวัง ทีมสามารถมีกฎ:
ถ้าชั้นไม่ได้เป็นประเภท NullableClass แล้วก็เช่นจะต้องไม่เป็นโมฆะ
ทีมสามารถเสริมความคิดนี้โดยใช้การออกแบบตามสัญญาและการตรวจสอบแบบคงที่ในเวลารวบรวมเช่นด้วยเงื่อนไขก่อนหน้านี้:
function SaveCustomer([NotNullAttribute]Customer customer){
// there is no need to check whether customer is null
// it is a client problem, not this supplier
}
หรือสำหรับสตริง
function GetCustomer([NotNullAndNotEmptyAttribute]String customerName){
// there is no need to check whether customerName is null or empty
// it is a client problem, not this supplier
}
วิธีการเหล่านี้สามารถเพิ่มความน่าเชื่อถือของแอปพลิเคชั่นและคุณภาพซอฟต์แวร์ได้อย่างมาก ออกแบบโดยสัญญาเป็นกรณีของตรรกะ Hoareซึ่งมีประชากรโดย Bertrand Meyer ในหนังสือ Object-Oriented Software Construction และภาษาไอเฟลที่มีชื่อเสียงของเขาในปี 1988 แต่มันไม่ได้ใช้อย่างไม่ถูกต้องในการประดิษฐ์ซอฟต์แวร์ที่ทันสมัย