หากคุณรู้สึกว่าถูกบังคับให้ต้องขยายสายการบินหนึ่งสาย
a = F(G1(H1(b1), H2(b2)), G2(c1));
ฉันจะไม่โทษคุณ ไม่เพียงอ่านยากเท่านั้นมันยากที่จะแก้ไขข้อผิดพลาด
ทำไม?
- มันหนาแน่น
- ผู้ดีบักบางคนจะเน้นเฉพาะเรื่องทั้งหมดในคราวเดียว
- ไม่มีชื่อที่สื่อความหมาย
หากคุณขยายด้วยผลลัพธ์ระดับกลางคุณจะได้รับ
var result_h1 = H1(b1);
var result_h2 = H2(b2);
var result_g1 = G1(result_h1, result_h2);
var result_g2 = G2(c1);
var a = F(result_g1, result_g2);
และยังอ่านยาก ทำไม? แก้ปัญหาสองข้อและแนะนำข้อที่สี่:
มันหนาแน่น
ผู้ดีบักบางคนจะเน้นเฉพาะเรื่องทั้งหมดในคราวเดียว
- ไม่มีชื่อที่สื่อความหมาย
- มันรกด้วยชื่อที่ไม่สื่อความหมาย
หากคุณขยายด้วยชื่อที่เพิ่มความหมายใหม่ดีความหมายดียิ่งขึ้น! ชื่อที่ดีช่วยให้ฉันเข้าใจ
var temperature = H1(b1);
var humidity = H2(b2);
var precipitation = G1(temperature, humidity);
var dewPoint = G2(c1);
var forecast = F(precipitation, dewPoint);
อย่างน้อยตอนนี้บอกเล่าเรื่องราว มันแก้ไขปัญหาและชัดเจนกว่าสิ่งอื่นใดที่นำเสนอที่นี่ แต่คุณต้องมีชื่อ
หากคุณทำมันด้วยชื่อที่ไม่มีความหมายเช่นresult_this
และresult_that
เพราะคุณไม่สามารถนึกถึงชื่อที่ดีได้ฉันก็อยากให้คุณช่วยถ่วงชื่อที่ไม่มีความหมายและขยายมันโดยใช้ช่องว่างเก่า ๆ ที่ดี:
int a =
F(
G1(
H1(b1),
H2(b2)
),
G2(c1)
)
;
มันสามารถอ่านได้ถ้าไม่มากไปกว่าที่มีชื่อผลลัพธ์ที่ไม่มีความหมาย (ไม่ใช่ว่าชื่อฟังก์ชันเหล่านี้ยอดเยี่ยม)
มันหนาแน่น
ผู้ดีบักบางคนจะเน้นเฉพาะเรื่องทั้งหมดในคราวเดียว
- ไม่มีชื่อที่สื่อความหมาย
มันรกด้วยชื่อที่ไม่สื่อความหมาย
เมื่อคุณไม่สามารถนึกถึงชื่อที่ดีได้มันก็เป็นอย่างดี
ด้วยเหตุผลบางประการที่นักดีบักชอบบรรทัดใหม่ดังนั้นคุณควรพบว่าการดีบั๊กนี้ไม่ยาก:
หากยังไม่พอให้จินตนาการG2()
ถูกเรียกมากกว่าหนึ่งแห่งแล้วสิ่งนี้ก็เกิดขึ้น:
Exception in thread "main" java.lang.NullPointerException
at composition.Example.G2(Example.java:34)
at composition.Example.main(Example.java:18)
ฉันคิดว่ามันดีที่การG2()
โทรแต่ละครั้งจะอยู่ในสายของตัวเองสไตล์นี้จะนำคุณไปยังสายที่ละเมิดหลักโดยตรง
ดังนั้นโปรดอย่าใช้ปัญหา 1 และ 2 เป็นข้ออ้างที่จะทำให้เรามีปัญหา 4 ใช้ชื่อที่ดีเมื่อคุณนึกถึงพวกเขา หลีกเลี่ยงชื่อที่ไม่มีความหมายเมื่อคุณทำไม่ได้
Lightness Races ในความคิดเห็นของ Orbit ชี้ให้เห็นอย่างถูกต้องว่าฟังก์ชั่นเหล่านี้เป็นของปลอมและมีชื่อที่น่าสงสาร ดังนั้นนี่คือตัวอย่างของการใช้สไตล์นี้กับโค้ดบางส่วนจากไวด์:
var user = db.t_ST_User.Where(_user => string.Compare(domain,
_user.domainName.Trim(), StringComparison.OrdinalIgnoreCase) == 0)
.Where(_user => string.Compare(samAccountName, _user.samAccountName.Trim(),
StringComparison.OrdinalIgnoreCase) == 0).Where(_user => _user.deleted == false)
.FirstOrDefault();
ฉันเกลียดการดูเสียงดังแม้ไม่จำเป็นต้องห่อคำ นี่คือรูปลักษณ์ภายใต้สไตล์นี้:
var user = db
.t_ST_User
.Where(
_user => string.Compare(
domain,
_user.domainName.Trim(),
StringComparison.OrdinalIgnoreCase
) == 0
)
.Where(
_user => string.Compare(
samAccountName,
_user.samAccountName.Trim(),
StringComparison.OrdinalIgnoreCase
) == 0
)
.Where(_user => _user.deleted == false)
.FirstOrDefault()
;
อย่างที่คุณเห็นฉันพบว่าสไตล์นี้ใช้งานได้ดีกับรหัสการทำงานที่เคลื่อนที่ไปในพื้นที่เชิงวัตถุ หากคุณสามารถสร้างชื่อที่ดีให้เป็นแบบกลางได้พลังมากขึ้นสำหรับคุณ ก่อนหน้านี้ฉันใช้มัน แต่ในกรณีใด ๆ โปรดค้นหาวิธีหลีกเลี่ยงชื่อผลลัพธ์ที่ไม่มีความหมาย พวกเขาทำให้ดวงตาของฉันเจ็บ