กำหนดรหัสที่แข็งแกร่งคืออะไร


42

อาจารย์ของฉันอ้างอิงถึงตัวอย่าง Java นี้เมื่อเขาพูดถึงรหัส "แข็งแกร่ง":

if (var == true) {
    ...
} else if (var == false) {
    ...
} else {
    ...
}

เขาอ้างว่า "รหัสที่มีประสิทธิภาพ" หมายถึงโปรแกรมของคุณคำนึงถึงความเป็นไปได้ทั้งหมดและไม่มีสิ่งใดเป็นข้อผิดพลาด - ทุกสถานการณ์ได้รับการจัดการโดยรหัสและส่งผลให้อยู่ในสถานะที่ถูกต้องดังนั้นจึงเป็น "อื่น"

อย่างไรก็ตามฉันสงสัยว่า หากตัวแปรเป็นบูลีนจุดตรวจสอบสถานะที่สามคืออะไรเมื่อสถานะที่สามเป็นไปไม่ได้ทางตรรกะ?

"ไม่มีสิ่งเช่นข้อผิดพลาด" ดูเหมือนไร้สาระเช่นกัน; แม้แอปพลิเคชันของ Google จะแสดงข้อผิดพลาดโดยตรงกับผู้ใช้แทนที่จะกลืนให้เงียบหรืออย่างใดถือว่าพวกเขาเป็นสถานะที่ถูกต้อง และมันก็เป็นเรื่องดี - ฉันชอบที่จะรู้ว่าเมื่อมีอะไรผิดปกติ และดูเหมือนว่าการอ้างสิทธิ์ว่าแอปพลิเคชันจะไม่มีข้อผิดพลาดเลย

ดังนั้นนิยามที่แท้จริงของ "รหัสที่มีประสิทธิภาพ" คืออะไร?



4
สิ่งนี้จะถือเป็นภาษาที่ไม่ได้พิมพ์อย่างยิ่งเท่านั้น ในภาษาที่พิมพ์อย่างรุนแรงตัวแปรของบูลีนประเภท (ไม่ใช่จำนวนเต็มวางตัวเป็นบูลีน) สามารถเป็นจริงหรือเท็จเท่านั้นไม่มีตัวเลือกที่สาม ...
Marjan Venema

23
ถามเขาว่าคุณจะทดสอบการรายงานข่าวในกรณีที่ 3 ได้อย่างไรเนื่องจากรหัสที่มีประสิทธิภาพควรมีการทดสอบอย่างแน่นอนและหากคุณไม่ได้จัดการทดสอบกรณีที่ 3 คุณจะไม่สามารถพบข้อบกพร่องใด ๆ ที่อาจแฝงตัวอยู่ในนั้น
gbjbaanb

2
@Marjan - ในภาษาที่ไม่ได้พิมพ์อย่างรุนแรงมีแนวโน้มมากที่สุดเพียงแค่เขียน: ถ้า (var) {} else {}
kevin cline

2
ฉันไม่รู้ภาษาใด ๆ ที่ทั้ง x และ! x อาจเป็นจริงได้ โปรดทราบว่าฉันไม่ได้แนะนำ "ถ้า (x == จริง) ... "; ฉันเกลียดการเปรียบเทียบดังกล่าว
วินไคลน์

คำตอบ:


33

จุดตรวจสอบสถานะที่สามคืออะไรเมื่อสถานะที่สามเป็นไปไม่ได้ในเชิงตรรกะ

สิ่งที่เกี่ยวกับสถานะBoolean?ที่อนุญาตให้เป็นNULLรัฐที่ไม่จริงหรือเท็จ ตอนนี้ซอฟต์แวร์ควรทำอย่างไร? ซอฟต์แวร์บางตัวต้องมีความทนทานต่อความผิดพลาดสูงเช่นเครื่องกระตุ้นหัวใจ เคยเห็นใครบางคนเพิ่มคอลัมน์ในฐานข้อมูลที่เป็นBooleanและเริ่มต้นข้อมูลปัจจุบันเพื่อNULLเริ่มต้นหรือไม่ ฉันรู้ว่าฉันเคยเห็นมัน

ต่อไปนี้เป็นลิงค์บางส่วนที่อธิบายถึงความแข็งแกร่งในแง่ของซอฟต์แวร์:

หากคุณคิดว่ามีคำนิยาม "แข็งแกร่ง" ที่ตกลงกันในระดับสากลอยู่ที่นี่ขอให้โชคดี อาจมีคำพ้องความหมายบางอย่างเช่นระเบิดหรือหลักฐานบ้า โปรแกรมเมอร์เทป Ductจะเป็นตัวอย่างของคนที่มักจะเขียนรหัสที่มีประสิทธิภาพอย่างน้อยในความเข้าใจของฉันของข้อตกลง


13
ถ้านี่เป็นบูลีนที่เป็นโมฆะทั้ง Java และ c # จะทำการโยนดังนั้นควรตรวจสอบค่าว่างก่อน
Esben Skov Pedersen

ดูเหมือนว่าจะไม่มีการตกลงกันอย่างกว้างขวางตามคำจำกัดความของแมวหรือสุนัข
Tulains Córdova

11

เพื่อประโยชน์ในการพูดคุยของฉันบูลสามารถมี 2 สถานะคือจริงหรือเท็จ สิ่งอื่นใดที่ไม่เป็นไปตามข้อกำหนดการเขียนโปรแกรม langugae หากห่วงโซ่เครื่องมือของคุณไม่สอดคล้องกับข้อกำหนดคุณจะถูก hosed ไม่ว่าคุณจะทำอะไร หากนักพัฒนาสร้าง Bool ประเภทที่มีมากกว่า 2 สถานะมันเป็นสิ่งสุดท้ายที่เขาจะทำบน codebase ของฉัน

ตัวเลือก A.

if (var == true) {
    ...
} else if (var == false) {
    ...
} else {
    ...
}

ตัวเลือก B

if (var == true) {
    ...
} else {
    ...
}

ฉันยืนยันตัวเลือก B นั้นแข็งแกร่งกว่า .....

twit ใด ๆ สามารถบอกให้คุณจัดการกับข้อผิดพลาดที่ไม่คาดคิด พวกมันมักจะตรวจจับได้ง่ายเมื่อคุณนึกถึงพวกเขา ตัวอย่างอาจารย์ที่คุณให้มาไม่ใช่สิ่งที่อาจเกิดขึ้นดังนั้นมันจึงเป็นตัวอย่างที่แย่มาก

A ไม่สามารถทำการทดสอบได้หากไม่มีสายการทดสอบที่ซับซ้อน หากคุณไม่สามารถสร้างมันขึ้นมาคุณจะทดสอบมันอย่างไร หากคุณยังไม่ได้ทดสอบโค้ดคุณจะรู้ได้อย่างไรว่าทำงานได้อย่างไร หากคุณไม่รู้ว่ามันใช้งานได้แสดงว่าคุณไม่ได้เขียนซอฟต์แวร์ที่มีประสิทธิภาพ ฉันคิดว่าพวกเขายังคงเรียกว่า Catch22 (ภาพยนตร์ยอดเยี่ยมดูบางครั้ง)

ตัวเลือก B นั้นไม่สำคัญสำหรับการทดสอบ

ปัญหาต่อไปขอให้คุณศาสตราจารย์คำถามนี้ "คุณต้องการให้ฉันทำอะไรถ้าบูลีนไม่ใช่ของจริงหรือเท็จ?" นั่นควรนำไปสู่การสนทนาที่น่าสนใจมาก .....

กรณีส่วนใหญ่การถ่ายโอนข้อมูลหลักเป็นที่น่ากลัวอย่างยิ่งที่จะทำให้ผู้ใช้รำคาญหรือเสียค่าใช้จ่ายเป็นจำนวนมาก จะทำอย่างไรถ้าพูดว่าโมดูลนั้นเป็นระบบการคำนวณย้อนกลับสู่อวกาศเรียลไทม์กระสวย? คำตอบใด ๆ ไม่ว่าวิธีที่ไม่ถูกต้องจะไม่เลวร้ายยิ่งไปกว่าการยกเลิกซึ่งจะฆ่าผู้ใช้ ดังนั้นถ้าคุณรู้ว่าคำตอบอาจผิดไป 50/50 หรือยกเลิกแล้วไป 100% ความล้มเหลว ถ้าฉันเป็นสมาชิกลูกเรือฉันจะรับ 50/50

ตัวเลือก A ฆ่าฉันตัวเลือก B ให้โอกาสฉันอยู่รอด

แต่เดี๋ยวก่อน - มันเป็นแบบจำลองของกระสวยอวกาศย้อนกลับ - แล้วอะไรนะ? ยกเลิกเพื่อให้คุณรู้เกี่ยวกับมัน เสียงเหมือนความคิดที่ดี? - ไม่ - เพราะคุณต้องทดสอบด้วยรหัสที่คุณวางแผนจะจัดส่ง

ตัวเลือก A นั้นดีกว่าสำหรับการจำลอง แต่ไม่สามารถปรับใช้ มันเป็นตัวเลือกที่ไร้ประโยชน์ B เป็นรหัสที่นำไปใช้งานดังนั้นการจำลองจะทำงานเหมือนกับระบบจริง

สมมติว่านี่เป็นข้อกังวลที่ถูกต้อง ทางออกที่ดีกว่าคือการแยกการจัดการข้อผิดพลาดออกจากตรรกะของแอปพลิเคชัน

if (var != true || var != false) {
    errorReport("Hell just froze over, var must be true or false")
}
......
if (var == true){
 .... 
} else {
 .... 
}

อ่านเพิ่มเติม - เครื่อง Therac-25 Xray ความล้มเหลวของจรวด Ariane 5 และอื่น ๆ (ลิงก์มีลิงก์ที่ใช้งานไม่ได้มากมาย แต่มีข้อมูลเพียงพอที่ Google จะช่วย)


1
".. ข้อผิดพลาดที่ไม่คาดคิดพวกเขามักจะตรวจจับได้ง่ายเมื่อคุณนึกถึงพวกเขา" - แต่เมื่อคุณคิดถึงพวกเขาพวกเขาจะไม่คาดคิดอีกต่อไป
gbjbaanb

7
มีคำถามว่ารหัสของคุณif (var != true || var != false) {ควรเป็นคำถาม&&แทนหรือไม่

1
ฉันสามารถนึกถึงบูลที่ไม่ใช่ของจริงหรือเท็จ แต่ก็ยังไม่คาดคิด ในกรณีที่คุณบอกว่าบูลไม่สามารถเป็นอย่างอื่นได้ถ้าฉันตรวจสอบว่าตัวอักษรเป็นตัวอักษรหลักแล้วแปลงเป็นค่าจำนวนเต็มฉันสามารถนึกได้ว่าค่าจำนวนเต็มนั้นน้อยกว่า 0 หรือมากกว่า 9 แต่ก็ยังคง ไม่คาดฝัน
gnasher729

1
Null Booleans ได้รับการสนับสนุนใน Java และ C # และมีแอปพลิเคชันที่ใช้งานจริง พิจารณาฐานข้อมูลที่มีรายชื่อบุคคล หลังจากที่ในขณะที่คุณตัดสินใจว่าคุณต้องการฟิลด์เพศ (isMale) Null แปลว่า "ไม่เคยถามดังนั้นไม่ทราบ"; true หมายถึง male และ false หมายถึงเพศหญิง (ตกลงเพศข้ามถูกละเว้นเพื่อความเรียบง่าย ... )
kiwiron

@kiwiron: จะเป็นทางออกที่ดีกว่าหากไม่ใช้ประเภทการระบุ "ชาย", "หญิง", "ไม่ได้ถาม" การแจกแจงจะดีกว่า - สามารถขยายออกไปได้เมื่อต้องการ (เช่นผู้ที่ไม่เชื่อเรื่องเพศ, กระเทย, "ปฏิเสธคำตอบ")
mattnz

9

ที่จริงแล้วรหัสของคุณไม่ได้แข็งแกร่งกว่า แต่มีประสิทธิภาพน้อยกว่า สุดท้ายelseคือรหัสตายตัวที่คุณไม่สามารถทดสอบได้

ในซอฟต์แวร์ที่มีความสำคัญเช่นในยานอวกาศห้ามใช้รหัสที่ไม่ได้ใช้และรหัสที่ยังไม่ได้ทดสอบ: หากรังสีคอสมิกก่อให้เกิดความปั่นป่วนเหตุการณ์เดียวซึ่งในทางกลับกันทำให้รหัสตายของคุณถูกเปิดใช้งาน หาก SEU เปิดใช้งานส่วนหนึ่งของรหัสที่แข็งแกร่งพฤติกรรม (ไม่คาดคิด) จะยังคงอยู่ภายใต้การควบคุม


ฉันไม่เข้าใจมันในยานอวกาศเป็นรหัสต้องห้ามหรือไม่? นั่นคือคุณไม่สามารถเขียนครั้งสุดท้าย? ตั้งแต่คุณไม่สามารถทดสอบได้คุณไม่สามารถใส่มันได้? แต่แล้วมันหมายความว่าอะไร "ถ้า SEU เปิดใช้งานส่วนหนึ่งของรหัสที่มีประสิทธิภาพพฤติกรรม (ไม่คาดคิด) ยังคงอยู่ภายใต้การควบคุม"
โทรม

5
ใช่การครอบคลุมการทดสอบซอฟต์แวร์ที่สำคัญในอวกาศจะต้องเป็น 100% และเป็นสิ่งต้องห้ามเนื่องจากรหัสที่ไม่สามารถเข้าถึงได้ (อาร์โค้ดตายตัว) เป็นสิ่งต้องห้าม
mouviciel

7

ฉันคิดว่าอาจารย์อาจสับสน "ข้อผิดพลาด" และ "ข้อผิดพลาด" รหัสที่แข็งแกร่งควรมีข้อบกพร่องเล็กน้อย / ไม่มีเลย รหัสที่แข็งแกร่งอาจและในสภาพแวดล้อมที่เป็นมิตรต้องมีการจัดการข้อผิดพลาดที่ดี (ไม่ว่าจะเป็นข้อยกเว้นในการจัดการหรือการทดสอบสถานะการคืนสินค้าอย่างเข้มงวด)

ฉันยอมรับว่าตัวอย่างรหัสของอาจารย์นั้นโง่ แต่ไม่โง่เหมือนของฉัน

// Assign 3 to x
var x = 3;
x = 3;   // again, just for sure
while (x < 3 or x > 3) { x = 3; }  // being robust
if (x != 3) { ... }  // this got to be an error!

1
คนสุดท้ายถ้าถูกกระตุ้นอย่างแน่นอนมันคงไม่ต้องใช้ความพยายามมากขนาดนั้น โปรแกรมเมอร์ C ที่มีประสบการณ์ทุกคนจะเห็นคุณค่าของการเปลี่ยนแปลงในทันใด แน่นอนว่ามีเหตุผลในสภาพแวดล้อมแบบเธรดเดี่ยวที่ควบคุมสิ่งนี้ไม่ควรเกิดขึ้น ในชีวิตจริงรหัสภายในถ้าในที่สุดจะเกิดขึ้น หากไม่มีสิ่งใดที่เป็นประโยชน์คุณสามารถทำสิ่งนั้นได้ถ้าหากอย่าทำรหัส! (ฉันมีประสบการณ์ที่ตลกในระหว่างการพัฒนาซอฟต์แวร์โดยเฉพาะที่ฉันยกข้อยกเว้นด้วยคำสาปในกรณีที่สิ่งที่เป็นไปไม่ได้เกิดขึ้น ... เดาว่าเกิดอะไรขึ้น?)
อเล็กซ์

2
เรื่องจริง:boolean x = something(); if (x) { x = True // make sure it's really true, ... }
Andres F.

6

ไม่มีการตกลงกันในนิยามของRobust Codeเนื่องจากหลาย ๆ สิ่งในการเขียนโปรแกรมมันเป็นอัตนัยมากหรือน้อย ...

ตัวอย่างที่อาจารย์ให้นั้นขึ้นอยู่กับภาษา:

  • ใน Haskell Booleanสามารถเป็นได้TrueหรือFalseไม่มีตัวเลือกที่สาม
  • ใน C ++ เป็นboolสามารถtrue, falseหรือ (ขออภัย) มาจากบางส่วนหล่อน่าสงสัยที่วางไว้ในกรณีที่ไม่รู้จัก ... นี้ควรจะไม่เกิดขึ้น แต่อาจเป็นผลมาจากข้อผิดพลาดก่อนหน้านี้

แต่สิ่งที่อาจารย์ของคุณคือการให้คำปรึกษาปิดบังรหัสโดยการแนะนำตรรกะภายนอกสำหรับควรที่ไม่เกิดขึ้นเหตุการณ์ที่เกิดขึ้นในช่วงกลางของโปรแกรมหลักดังนั้นฉันจะชี้ให้คุณแทนไปยังโปรแกรมป้องกัน

ในกรณีที่เป็นมหาวิทยาลัยคุณสามารถเพิ่มได้โดยใช้กลยุทธ์ Design By Contract:

  • สร้างค่าคงที่สำหรับคลาส (เช่นsizeคือจำนวนรายการในdataรายการ)
  • สร้างเงื่อนไขก่อนและหลังเงื่อนไขสำหรับแต่ละฟังก์ชัน (เช่นฟังก์ชันนี้อาจถูกเรียกใช้โดยมีaค่าน้อยกว่า10)
  • ทดสอบแต่ละอันที่ทางเข้าและออกของแต่ละฟังก์ชั่นของคุณ

ตัวอย่าง:

class List:
  def __init__(self, items):
    self.__size = len(items)
    self.__data = items

  def __invariant(self):
    assert self.__size == len(self.__data)

  def size(self):
    self.__invariant()

    return self.__size

  def at(self, index):
    """index should be in [0,size)"""
    self.__invariant()
    assert index >= 0 and index < self.__size

    return self.__data[index]

  def pushback(self, item):
    """the subsequent list is one item longer
       the item can be retrieved by self.at(self.size()-1)"""
    self.__invariant()

    self.__data.append(item)
    self.__size += 1

    self.__invariant()
    assert self.at(self.size()-1) == item

แต่อาจารย์บอกว่ามันเป็นจาวาโดยเฉพาะและไม่ได้บอกว่าประเภทของ var คืออะไร ถ้าเป็นบูลีนมันอาจเป็นจริงเท็จหรือเป็นโมฆะ ถ้าอย่างอื่นมันอาจไม่เท่าเทียมกับทั้งจริงและไม่เท่ากันเป็นเท็จ ใช่ทับซ้อนกันระหว่างแข็งแกร่งป้องกันและหวาดระแวง
Andy Canfield

2
ใน C, C ++ และ Objective-C บูลสามารถมีค่าไม่แน่นอนเช่นประเภทอื่น ๆ แต่การมอบหมายใด ๆ จะตั้งค่าเป็นจริงหรือเท็จและไม่มีอะไรอื่น ตัวอย่างเช่น: bool b = 0; ข ++; ข ++; จะตั้งค่า b เป็นจริง
gnasher729

2

แนวทางของอาจารย์ของคุณเข้าใจผิดโดยสิ้นเชิง

ฟังก์ชั่นหรือรหัสเพียงเล็กน้อยควรมีสเป็คที่ระบุว่ามันทำอะไรซึ่งควรครอบคลุมทุกอินพุตที่เป็นไปได้ และควรเขียนโค้ดเพื่อให้มั่นใจได้ว่าพฤติกรรมของมันจะตรงกับข้อมูลจำเพาะ ในตัวอย่างฉันจะเขียนสเป็คที่ค่อนข้างง่ายเช่นนี้:

Spec: If var is false then the function does "this", otherwise it does "that". 

จากนั้นคุณเขียนฟังก์ชัน:

if (var == false) dothis; else dothat; 

และรหัสตรงตามข้อกำหนด ดังนั้นอาจารย์ของคุณพูดว่า: ถ้าวา = = 42? ดูข้อมูลจำเพาะ: มันบอกว่าฟังก์ชั่นควรทำ "ที่" ดูรหัส: ฟังก์ชั่นทำ "ที่" ฟังก์ชั่นตรงตามข้อกำหนด

ในกรณีที่รหัสของอาจารย์ของคุณทำสิ่งที่ไม่น่าเชื่อถืออย่างสมบูรณ์คือความจริงที่ว่าด้วยวิธีการของเขาเมื่อ var ไม่ใช่ความจริงหรือเท็จมันจะเรียกใช้งานโค้ดที่ไม่เคยถูกเรียกมาก่อน


1

ฉันเห็นด้วยกับคำสั่งของ @ gnasher729: แนวทางของอาจารย์ของคุณนั้นเข้าใจผิดโดยสิ้นเชิง

แข็งแกร่งหมายความว่ามันทนทานต่อการแตกหัก / ความล้มเหลวเพราะมันทำให้สมมติฐานน้อยและแยกออกจากกัน: มันมีอยู่ในตัวเองกำหนดตัวเองและพกพา นอกจากนี้ยังรวมถึงการปรับให้เข้ากับความต้องการที่เปลี่ยนแปลง ในคำให้รหัสของคุณคงทน

โดยทั่วไปจะแปลเป็นฟังก์ชั่นสั้น ๆ ที่รับข้อมูลจากพารามิเตอร์ที่ส่งผ่านโดยผู้เรียกและการใช้อินเตอร์เฟสสาธารณะสำหรับผู้บริโภค - วิธีนามธรรม, wrappers, อ้อม, อินเทอร์เฟซ COM สไตล์ ฯลฯ - มากกว่าฟังก์ชั่นที่มีรหัสการนำคอนกรีต


0

รหัสที่แข็งแกร่งคือรหัสที่สามารถจัดการกับความล้มเหลวได้เป็นอย่างดี ไม่มากไม่น้อย.

ของความล้มเหลวมีหลายประเภท: รหัสที่ไม่ถูกต้อง, รหัสไม่สมบูรณ์, ค่าที่ไม่คาดคิด, สถานะที่ไม่คาดคิด, ข้อยกเว้น, ความอ่อนล้าของทรัพยากร, .... รหัสที่แข็งแกร่งจัดการกับสิ่งเหล่านี้ได้ดี


0

ฉันจะพิจารณารหัสที่คุณให้ไว้เป็นตัวอย่างของการตั้งโปรแกรมป้องกัน (อย่างน้อยที่สุดฉันจะใช้คำนี้) ส่วนหนึ่งของการเขียนโปรแกรมเชิงป้องกันคือการเลือกตัวเลือกที่ลดการสันนิษฐานเกี่ยวกับพฤติกรรมของส่วนที่เหลือของระบบ ตัวอย่างเช่นข้อใดต่อไปนี้ดีกว่า:

for (int i = 0; i != sequence.length(); ++i) {
    // do something with sequence[i]
}

หรือ:

for (int i = 0; i < sequence.length(); ++i) {
    // do something with sequence[i]
}

(ในกรณีที่คุณมีปัญหาในการมองเห็นความแตกต่างให้ตรวจสอบการทดสอบลูป: การใช้ครั้งแรกการใช้ครั้ง!=ที่สอง<)

ตอนนี้ภายใต้สถานการณ์ส่วนใหญ่ลูปทั้งสองจะทำงานในลักษณะเดียวกัน อย่างไรก็ตามครั้งแรก (เมื่อเทียบกับ!=) ทำให้สมมติฐานที่iจะเพิ่มขึ้นเพียงครั้งเดียวต่อการทำซ้ำ ถ้ามันข้ามค่าsequence.length()จากนั้นวงสามารถดำเนินการต่อไปเกินขอบเขตของลำดับและทำให้เกิดข้อผิดพลาด

คุณสามารถโต้แย้งได้ว่าการนำไปใช้ครั้งที่สองนั้นมีความสมบูรณ์มากขึ้น: มันไม่ได้ขึ้นอยู่กับข้อสันนิษฐานว่าการเปลี่ยนแปลงเนื้อหาของวงวนนั้นหรือไม่i(หมายเหตุ: จริงๆแล้วมันยังทำให้สมมติฐานที่iไม่เคยเป็นเชิงลบ)

เพื่อให้มีแรงจูงใจสำหรับสาเหตุที่คุณอาจไม่ต้องการตั้งสมมติฐานลองจินตนาการว่าลูปกำลังสแกนสตริงทำการประมวลผลข้อความ คุณเขียนลูปและทุกอย่างเรียบร้อยดี ตอนนี้ความต้องการของคุณเปลี่ยนไปและคุณตัดสินใจว่าคุณจำเป็นต้องสนับสนุนอักขระการหลีกเลี่ยงในสตริงข้อความดังนั้นคุณเปลี่ยนเนื้อความวนซ้ำเช่นนั้นหากตรวจพบอักขระการหลบหลีก (เช่นแบ็กสแลช) มันจะเพิ่มขึ้นiเพื่อข้ามอักขระทันทีหลังจากการหลบหนี ตอนนี้การวนซ้ำครั้งแรกมีข้อผิดพลาดเนื่องจากถ้าอักขระตัวสุดท้ายของข้อความเป็นแบ็กสแลชตัววนซ้ำจะเพิ่มขึ้นiและการวนซ้ำจะดำเนินต่อไปเมื่อสิ้นสุดลำดับ


-1

ฉันอธิบายรหัสเป็น 'แข็งแกร่ง' โดยส่วนตัวซึ่งมีคุณลักษณะที่สำคัญนี้:

  1. ถ้าแม่ของฉันนั่งอยู่ข้างหน้าและทำงานกับมันเธอจะไม่สามารถทำลายระบบได้

ตอนนี้โดยแบ่งผมหมายถึงทั้งระบบได้รับเข้าไปในสถานะที่ไม่เสถียรหรือก่อให้เกิดunhandledข้อยกเว้น คุณรู้บางครั้งสำหรับแนวคิดง่ายๆคุณสามารถสร้างคำจำกัดความที่ซับซ้อนและคำอธิบาย แต่ฉันต้องการคำจำกัดความง่าย ๆ ผู้ใช้ค่อนข้างดีในการค้นหาแอปพลิเคชันที่มีประสิทธิภาพ หากผู้ใช้แอปพลิเคชันของคุณส่งคำขอมากมายเกี่ยวกับข้อบกพร่อง, เกี่ยวกับการสูญเสียสถานะ, เกี่ยวกับเวิร์กโฟลว์ที่ไม่ได้ใช้งาน, ฯลฯ แสดงว่ามีบางอย่างผิดปกติกับการเขียนโปรแกรมของคุณ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.