ข้อห้ามในการใช้ลูปภายในลูปคืออะไร


23

แค่สงสัย. สิ่งที่ฉันเคยมีมากที่สุดคือสำหรับวงในสำหรับวงเนื่องจากหลังจากอ่านบทความนี้จากLinus Torvalds:

แท็บคือ 8 ตัวอักษรและทำให้การเยื้องเป็น 8 ตัวอักษร มีการเคลื่อนไหวนอกรีตที่พยายามทำการเยื้อง 4 (หรือแม้แต่ 2!) ตัวละครที่ลึกและคล้ายกับการพยายามกำหนดค่าของ PI ให้เป็น 3

เหตุผล: แนวคิดทั้งหมดที่อยู่เบื้องหลังการเยื้องคือการกำหนดที่บล็อกของการควบคุมเริ่มต้นและสิ้นสุดอย่างชัดเจน โดยเฉพาะอย่างยิ่งเมื่อคุณดูหน้าจอเป็นเวลา 20 ชั่วโมงติดต่อกันคุณจะพบว่าการเยื้องนั้นง่ายกว่ามากหากคุณมีการเยื้องขนาดใหญ่

ตอนนี้บางคนจะอ้างว่าการมีการเยื้องตัวอักษร 8 ตัวทำให้โค้ดเคลื่อนที่ไปทางขวาจนเกินไปและทำให้อ่านได้ยากบนหน้าจอเทอร์มินัล 80 ตัว คำตอบก็คือหากคุณต้องการการเยื้องมากกว่า 3 ระดับคุณจะถูกเกลียวอยู่แล้วและควรแก้ไขโปรแกรมของคุณ

https://www.kernel.org/doc/Documentation/CodingStyle

ฉันคิดว่ามันเป็นวิธีปฏิบัติที่ยอมรับไม่ได้สำหรับฉันที่จะไปที่เลเยอร์ที่สามของการวนซ้ำและจะปรับโครงสร้างรหัสของฉัน (เบื้องต้น Qt)

Linus พูดเล่นหรือเปล่า

มันขึ้นอยู่กับภาษาหรือแอพพลิเคชั่นหรือไม่?

มีบางสิ่งที่จำเป็นต้องวนซ้ำอย่างน้อยสามระดับหรือไม่


8
ฉันสับสนว่าทำไมคุณกระโดดจากการเยื้องเป็นระดับการวนซ้ำ คุณมีคำพูดขนาดใหญ่ที่พูดถึงการเยื้องและทันใดนั้นคำถามต่อมาเกี่ยวกับลูปซ้อนกัน
Pieter B

5
Linus อาจไม่ใช่แค่ล้อเล่นในส่วนนั้น แต่โปรดทราบว่านี่เป็นเพียงแนวทางสไตล์เดียวและคู่มือนำลักษณะเดียวกันเน้นว่า "สไตล์การเขียนโปรแกรมเคอร์เนลนั้นง่ายมาก" กล่าวคือมากกว่าสไตล์อื่น ๆ

5
@Akiva คุณไม่สามารถผ่านเมทริกซ์ 4 มิติโดยไม่มีลูปซ้อนกัน 4 ลูป ฉันพบว่าคนบ้าจะ จำกัด จำนวนลูปซ้อนกันที่คุณมี เห็นได้ชัดว่าไลนัสเป็นคนทั่วไปมากและคุณไม่ควรนำทุกสิ่งที่คุณอ่านมาเป็นคัมภีร์ศักดิ์สิทธิ์
Alternatex

9
@Alternatex ที่คุณต้องการ 4 ลูปไม่ได้หมายความว่าพวกมันจะต้องซ้อนกันแบบคำศัพท์ มันค่อนข้างชัดเจนจากคำพูดที่เรากำลังพูดถึงวิธีการจัดระเบียบรหัสไม่เกี่ยวกับการดำเนินการ

4
@Delnan ฉันไม่ได้บอกว่ามีลูปซ้อนกัน 4 ลูปเป็นที่ชื่นชอบทางสายตาและฉันรู้ว่ามีวิธีอื่นที่จะไปเกี่ยวกับเรื่องนี้ ระดับที่ 4 ของการเยื้อง = จุดสิ้นสุดของโลก ขอพักหน่อย.
Alternatex

คำตอบ:


19

เคอร์เนลขอแนะนำอัลกอริธึมอย่างง่าย

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

นอกจากนี้ลินุกซ์เคอร์เนลจะแตกต่างจากรหัสใบสมัครมากที่สุดสำหรับความต้องการของการตรวจสอบแบบและการทดสอบ - จึงต้องการที่จะไม่ได้มีระดับ 4+ อัลกอริทึมที่ซ้อนกันในฟังก์ชั่นเดียว มันควรจะเป็นที่ชัดเจนที่จะเห็นสิ่งที่แต่ละรหัสส่วนไม่ว่าและในรายละเอียดรวมทั้งการควบคุมการไหลและขอบที่เป็นไปได้ทุกกรณี รหัสที่ซ้อนกันอย่างลึกซึ้งนั้นเป็นอุปสรรค


คุณคิดว่าด้วยภาษาระดับต่ำกว่าเช่น C, ลูปซ้อนกันลึกโดยทั่วไปbecauseโครงการต้องห้ามใช้ภาษาระดับต่ำกว่าได้รับประโยชน์จากรูปแบบการเข้ารหัสที่เพ่งความสนใจไปที่อัลกอริทึมที่ง่ายขึ้น?
Akiva

4
@Akiva ฉันจะไม่ผูกมันกับภาษาระดับต่ำกว่าหรือ C เช่นนี้ แต่แทนที่จะเป็นโดเมนของรหัส ฉันคิดว่าแนวทางที่คล้ายกันจะใช้กับภาษาใด ๆเมื่อเขียนรหัสที่ต้องมีความแข็งแกร่งความปลอดภัยที่มุ่งเน้นและตรวจสอบได้โดยค่าใช้จ่ายของสิ่งอื่น ๆ เช่นไลบรารีการเข้ารหัสที่เขียนด้วย Java หรือ Haskell ควรเขียนในสไตล์ที่ช่วยให้สิ่งต่าง ๆ เป็นไปได้ง่าย จำกัด การซ้อนและพยายามแยกทุกอย่างออกเป็นชิ้น ๆ ที่สามารถวิเคราะห์ได้อย่างง่ายดาย
Peteris

ข้อคิดเห็น / คำตอบที่ชาญฉลาดและมีประโยชน์ แค่สงสัย; โครงการประเภทใดที่ทำในวันนี้ซึ่งใช้ภาษาระดับต่ำจะไม่เน้นความแข็งแกร่งความสามารถในการตรวจสอบและความปลอดภัย
Akiva

7
@Akiva ตัวอย่างเช่นรหัสการเรียนรู้ของเครื่องที่คุณอาจต้องการใช้ C เพียงเพื่อเหตุผลด้านประสิทธิภาพ แต่ไม่สนใจมากเกี่ยวกับความทนทานหรือความปลอดภัยเนื่องจากมันจะทำงานภายในเงื่อนไขที่ควบคุม นอกจากนี้การใช้งานฟังก์ชั่นทางธุรกิจที่เรียบง่ายบนไมโครคอนโทรลเลอร์ขนาดเล็กที่ฝังตัว - ในทางปฏิบัติมักจะมีธุรกิจเช่นมุ่งเน้นไปที่คุณสมบัติและความเร็วในการพัฒนาที่มีค่าใช้จ่ายด้านคุณภาพและความปลอดภัย แต่ใช้ภาษาระดับต่ำ
Peteris

49

ในระดับที่ผมหยุดการพูดนี้อย่างจริงจัง"แท็บมี 8 ตัวอักษร" จุดรวมของ tabulators คือพวกเขาไม่ใช่จำนวนตัวอักษรคงที่ (ถ้ามีอะไรแท็บคือหนึ่งตัวอักษร) โหลดของ tosh อะไร ในทำนองเดียวกันฉันไม่เชื่ออย่างสมบูรณ์ว่าการตั้งกฎที่ยากและรวดเร็วของ "การเยื้องสามระดับ" นั้นมีเหตุผล (เท่าที่การตั้งกฎที่ยากและรวดเร็วสำหรับสิ่งใดก็ตามที่มีสติ)

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

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

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


6
ฉันเชื่อว่า "การประกาศ" ที่แท็บมีความยาว 8 ตัวอักษรโดยเฉพาะในบริบทของการพัฒนาเคอร์เนล คำพูดนี้นำมาจากแนวทางการเข้ารหัสสำหรับโครงการที่เฉพาะเจาะจงและไม่ได้มีวัตถุประสงค์เพื่อเป็นแนวทางการใช้งานทั่วไปและคาดว่าจะได้รับความเห็นค่อนข้างมาก
Lie Ryan

6
@LieRyan: จากนั้นก็ยัง tosh - แนวทางการเข้ารหัสสำหรับสิ่งที่ไม่มีธุรกิจที่กำหนดความกว้างแท็บของฉัน! แต่ฉันสงสัยว่าไลนัสรู้ดี
การแข่งขัน Lightness กับโมนิก้า

6
และแน่นอนมันขึ้นอยู่กับภาษา - ใน c # มันเป็นเรื่องธรรมดาที่คุณเยื้องในเนมสเปซของคุณในชั้นเรียนของคุณและในวิธีการของคุณ .. คุณอยู่ที่ 3 ระดับของการเยื้องก่อนที่คุณจะพูดถึงการควบคุมร่างกาย เว้าแหว่ง
PeterL

3
@LightnessRacesinOrbit ฉันตีความความคิดเห็น "แท็บคือ 8 ตัวอักษร" เพื่อไม่ได้หมายความว่าคุณต้องดูแท็บที่มีความกว้าง 8 ในตัวแก้ไขของคุณ แต่สำหรับวัตถุประสงค์ของกฎอื่น ๆ ในแนวทางสไตล์ (เช่น "ขีดจำกัดความยาวของบรรทัด คือ 80 คอลัมน์และนี่เป็นข้อ จำกัด ที่ต้องการอย่างยิ่ง ") ต้องมีแท็บที่มีขนาด 8 colums สิ่งนี้เกี่ยวข้องกับกฎอื่น ๆ ที่เกี่ยวข้องกับการจัดแนวอาร์กิวเมนต์ในการเรียกใช้ฟังก์ชัน อีกครั้งฉันไม่คิดว่าเจตนาของบรรทัดนั้นบังคับให้คุณดูแท็บอย่างนั้นเลยฉันได้ทำการปรับปรุงเคอร์เนลมาก่อนด้วยแท็บกว้าง 4 แท็บและทำการรีโค้ดในตอนท้าย
Vality

4
@underscore_d: ดูเหมือนว่าฉันผิด: Outside of comments, documentation and except in Kconfig, spaces are never used for indentation, and the above example is deliberately broken.- 6 ย่อหน้าจากเครื่องหมายคำพูดใน OP
slebetman

16

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


11
เผง มันง่ายเกินไปที่จะแนะนำ Torvalds ว่าเป็นคนโง่ (แน่นอนเขา) เขาอาจเข้มงวดเกินไปสำหรับรสนิยมของคุณ แต่เขาอธิบายถึงข้อกังวลในการพัฒนาที่แท้จริงซึ่งทำให้เกิดปัญหาจริง คุณไม่ต้องทำสิ่งที่เขาพูด แต่คุณควรคิดว่าทำไมเขาถึงพูด
Scant Roger

7
@ScantRoger ที่จริงแล้ว Torvalds- อ้างว่าจะฟังดูเข้มงวดเกินไปหากคุณไม่ได้รับอารมณ์ขัน อย่างที่ฉันจำไว้ก่อนหน้านี้ในเอกสารเดียวกันเขาแนะนำให้พิมพ์สำเนาของแนวทางการเข้ารหัสของ GNU เพื่อเขียนลงในพิธีบางอย่างเท่านั้น คุณจะไม่จริงจังกับเรื่องนั้นใช่ไหม ในคำพูดนี้ประเด็นหลักของเขาคือการกำหนดการเยื้องสำหรับเคอร์เนลลินุกซ์ให้มีแปดช่องว่างไม่มีอะไรมากและไม่น้อยไปกว่านี้นั่นคือสิ่งที่เขาเข้มงวด ประโยคสุดท้ายเป็นเพียงการขีดเส้นใต้จุดนั้นเท่านั้นไม่พูดว่าคุณจะต้องไม่ใช้การเยื้องในระดับที่มากขึ้น - ไม่มีความเข้มงวดโดยนัย
cmaster

1
@cmaster ขอบคุณสำหรับบริบทใช่มั้ย! ในการตอบคำถามของคุณฉันไม่ได้ใส่ใจอะไรเลย ;)
Scant Roger

2
@cmaster และจากนั้นหนึ่งคนจะอ่านการตอบสนองของเขาเพื่อขอให้ดึง github และความยาวบรรทัดของการส่งข้อความ เขาเป็นกรณีที่ถั่วทั้งหมด
Gusdor

3
การเขียนแนวทางการเข้ารหัสของ GNU แบบพิธีการอาจไม่จำเป็นจริง ๆ แต่เป็นระเบียบในเวลาใดก็ได้
dmckee

13

Linus พูดเล่นหรือเปล่า

ชิ้นส่วนถูกเขียนในสไตล์ขี้เล่นซึ่งแสดงให้เห็นว่าผู้เขียนมีความคุ้นเคยกับวิธีการเขียนโค้ดที่ถูกกล่าวถึงในหมู่ผู้ปฏิบัติงานที่จริงจัง: เราทุกคนมีความพึงพอใจของเราและเราปกป้องพวกเขาอย่างบ้าคลั่ง เราเข้าใจดีอย่างสมบูรณ์ว่าส่วนใหญ่เป็นเพียงเรื่องของรสนิยมส่วนตัว เขากล่าวว่าในหลาย ๆ คำ"Coding style is very personal, and I won't _force_ my views on anybody"อย่างน้อยนอกรหัสที่เขารักษาไว้เป็นการส่วนตัว แต่ความสอดคล้องของสไตล์ในโครงการที่กำหนดเป็นความคิดที่ดีมาก ฉันต้องการเขียนโค้ดให้เป็นสไตล์ที่ฉันไม่ชอบมากกว่าจัดการกับสไตล์ที่หลากหลายในฟังก์ชั่นที่กำหนด

นี่คือตัวอย่างของการเขียนที่ขี้เล่นอย่างชัดเจน:

However, there is one special case, namely functions: they have the
opening brace at the beginning of the next line, thus:

int function(int x)
{
    body of function
}

Heretic people all over the world have claimed that this inconsistency
is ...  well ...  inconsistent, but all right-thinking people know that
(a) K&R are _right_ and (b) K&R are right.  Besides, functions are
special anyway (you can't nest them in C).

ขี้เล่น (1)

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

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

หากคุณพบเจอใครบางคนบนอินเทอร์เน็ตที่คิดว่าเขาเข้าใจการเขียนโปรแกรมดีกว่า Torvalds (2) คุณก็รู้ว่าคนประเภทไหนที่ชอบคุยเรื่องใหญ่บนอินเทอร์เน็ต

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

(1) แต่ให้สังเกตว่าเขาวางช่องว่างไว้ตรงหน้าวงรีและช่องว่างสองช่องหลังจากนั้นและช่องว่างสองช่องหลังจากหยุดเต็ม ผิด, ผิด, ผิด จากนั้นเขาก็มีถุงน้ำดีที่ทำหน้าที่เป็นคนนอก คนนอกรีตคือคุณ Torvalds! มันคือคุณ!

(2) ถ้าคุณต้องการพูดคุยเกี่ยวกับ "การทำความเข้าใจวิธีการออกแบบระบบควบคุมแหล่งที่มา " อาจมีบางห้องสำหรับการอภิปราย

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

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


3
คำตอบที่ยอดเยี่ยม หนึ่งในกรณีที่สมควรได้รับ +2 ... (หมายเหตุ: ไม่มีช่องว่างที่ไม่ถูกต้อง.ในความคิดเห็นนี้ ;-))
cmaster

2
ย่อหน้าแนะนำของ Linus ที่คุณชี้ให้เห็นนั้นสำคัญมากดังนั้นขอบคุณที่ทำเช่นนั้น! ฉันคิดว่าประโยคแรกนั้นมีความสำคัญต่อบริบทpreferred coding styleเช่นกันโดยเฉพาะbut this is what goes for anything that I have to be able to maintain
Chris Haas

9

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

สำหรับตัวอย่างวิธีการทางเลือกคุณสามารถใช้การเรียกซ้ำแยกลูปด้านในออกเป็นฟังก์ชันของตนเองหรือสร้างโครงสร้างข้อมูลระดับกลาง

การซ้อนที่มากเกินไปเป็นหนึ่งในกรณีที่ง่ายต่อการเขียน แต่อ่านยากขึ้น การตั้งค่าความลึกแท็บขนาดใหญ่เป็นวิธีของ Linus ที่ทำให้การเขียนน่ารำคาญยิ่งขึ้น


3

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


1

เรื่องนี้ดูเหมือนจะเป็นกรณีตำราของหางกระดิกสุนัข

หากคุณมีการแสดงผล 80 ตัวอักษรแน่นอนว่าคุณกำลังพยายามทำโค้ดให้พอดีที่สุดเท่าที่จะทำได้แม้ว่ามันจะไม่ได้สร้างโครงสร้างที่ดีที่สุดสำหรับโค้ดก็ตาม

การแก้ปัญหาส่วนที่เหลือของคะแนนของคุณมุ่งไปที่:

ฉันคิดว่ามันเป็นการปฏิบัติที่ยอมรับไม่ได้

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

เขาล้อเล่นไหม?

ยากที่จะตรวจสอบบริบท แต่เห็นจุดเดิมของฉันข้างต้น

มันขึ้นอยู่กับภาษาหรือแอพพลิเคชั่นหรือไม่?

เป็นอย่างมาก ใช้ภาษาเมนเฟรม / ระดับกลางใด ๆ ที่คุณมีโอกาสเข้ารหัสบนเทอร์มินัล (หรือเทอร์มินัลอีมูเลเตอร์)

มีบางสิ่งที่จำเป็นต้องวนซ้ำอย่างน้อยสามระดับหรือไม่

ใช่มันเป็นเรื่องธรรมดามากในอัลกอริทึมกำลังดุร้ายบางอย่าง ดูที่ปัญหา 31เกี่ยวกับ Project Euler นี่เป็นตัวอย่างคลาสสิกของปัญหาที่สามารถแก้ไขได้ด้วยกำลังดุร้ายโดยใช้ลูปจำนวนหนึ่ง (8 เป็นค่าที่แน่นอน)


1
ดูเหมือนว่าปัญหา 31 ไม่ต้องการ bruteforce และสามารถแก้ไขได้โดยใช้อัลกอริทึมการเขียนโปรแกรมแบบไดนามิก (แก้ไข: ซึ่งหมายความว่าโครงสร้างโค้ดของคุณไม่ดีที่สุดหากคุณใช้อัลกอริทึม bruteforce) นอกจากนี้ประเด็นของไลนัสคือถ้ารหัสของคุณต้องการการเยื้องหลายระดับอาจเป็นไปได้ว่าโครงสร้างของโค้ดนั้นไม่ดีที่สุด
Vincent Savard

2
@VincentSavard ไม่เคยพูดว่าต้องใช้กำลังดุร้าย ไม่เห็นด้วยกับประเด็นที่สองของคุณ - บางครั้งมันเป็นวิธีที่ชัดเจนและรวบรัดที่สุดไม่พูดถึงประสิทธิภาพที่สุดในบางกรณี
Robbie Dee

1
ด้วยปัญหาแบบนั้นฉันมักจะไม่เยื้องลูป ฉันคิดว่าฉันมีกรณีหนึ่งที่มีลูปซ้อนกัน 20 ลูปเล็กน้อยที่จะเขียนอย่างแน่นอนและไม่มีการเยื้องเพื่อให้คุณเห็นลูปเกือบเหมือนกัน
gnasher729

1
@ RobbieDee: ประเด็นของฉันคือตัวอย่างของปัญหาที่แก้ไขโดยลูปจำนวนมากก็คืออัลกอริทึมของคุณไม่ได้มีประสิทธิภาพเท่ากับโซลูชันการเขียนโปรแกรมแบบไดนามิกซึ่งไม่ต้องการการเยื้องในระดับมาก ดังนั้นดังที่ Linus กล่าวว่าการเยื้องระดับของคุณสามารถลบออกได้โดยใช้วิธีแก้ปัญหาที่ดีกว่า คุณเข้าใจผิดจุดที่สองของฉันเพราะฉันเห็นด้วยกับสิ่งที่คุณพูด บางครั้งมันเป็นทางออกที่ดีที่สุด บางครั้งก็ไม่บ่อยและไม่น่าจะเป็นไปได้
Vincent Savard

1
ใบเสนอราคาของ Linus บอกอย่างชัดเจนว่าถ้ารหัสบางอย่างต้องการ bruteforcing นั่นเป็นปัญหา -31 คุณก็จะเมาอยู่ดี - มันจะไม่เร็วหรือง่ายและการทำงานของเคอร์เนลจะต้องรวดเร็วและง่ายดาย การรวมอัลกอริทึม O (n ^ 4) ในเคอร์เนลเป็นความเสี่ยงที่สำคัญของประสิทธิภาพการทำงานหรือการปฏิเสธปัญหาบริการดังนั้นในบริบทนี้คำแนะนำเพียงแค่เตือนว่านี่เป็นสัญญาณของรหัสที่อาจไม่เหมาะสมและต้องการใน Linux
Peteris

0

Linus พูดเล่นหรือเปล่า

ไม่ได้นั่นคือแนวทางปฏิบัติราชการ

มันขึ้นอยู่กับภาษาหรือแอพพลิเคชั่นหรือไม่?

โดยทั่วไปแนวทางการเข้ารหัสขึ้นอยู่กับภาษาและแอปพลิเคชันอย่างไรก็ตามรหัสที่ซ้อนกันอย่างล้ำลึกจะเก็บภาษีผู้อ่านเสมอ

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

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

มันเป็นกฎเกณฑ์และเพียงพอสำหรับพวกเขา

มีบางสิ่งที่จำเป็นต้องวนซ้ำอย่างน้อยสามระดับหรือไม่

อัลกอริทึมฉลาด แต่ในภาษาที่แสดงออกอย่างเพียงพอคุณสามารถ refactor รหัสเป็นชิ้นเล็ก ๆ (ไม่ว่าจะมีฟังก์ชั่นหรือปิด)

เห็นได้ชัดว่าคุณสามารถเขียนโค้ดที่ยุ่งเหยิงด้วยการทำรังน้อยและฟังก์ชั่นเล็ก ๆ มากมายที่โทรหากันโดยไม่ต้องสะกดคำสัญญา ...

... อย่างไรก็ตามฟังก์ชั่นขนาดเล็กที่มีสัญญาที่ชัดเจนนั้นง่ายต่อการตรวจสอบมากกว่าฟังก์ชั่นขนาดใหญ่ที่มีสัญญาที่ชัดเจนโดยทั่วไป


2
แม้ว่านี่อาจเป็นแนวทางอย่างเป็นทางการ แต่ก็ไม่สำคัญที่จะหาสถานที่ในรหัสเคอร์เนลที่ไม่มีการบังคับใช้หลักเกณฑ์
MikeB

1
@MikeB: เหตุผลเพิ่มเติมทั้งหมดในการบังคับใช้แนวทางโดยอัตโนมัติ ...
Matthieu M.

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