ชวา
ระยะเวลา หยุดเต็ม ตอนจบของเรื่อง.
จะเริ่มที่ไหนดี โอ้ฉันรู้ว่าจะเริ่มต้น: Java ซับซ้อนเมามันและน่าเกลียดและโง่และเสียเนื้อแท้ยาชื่อสามัญ ฉันต้องการพูดอีกหรือไม่ :( ตกลงปรับแล้ว: ลบออกประเภท
จากนั้นมีการจัดการทรัพยากรที่ไม่ได้กำหนดไว้ล่วงหน้า เท้า Kewl!
ถัดไปคืออะไร โอ้จ้ะ: regexes ที่โง่ที่สุดของ Java เป็นเนื้อวัวที่น่ารำคาญที่สุดของฉัน ฉันไม่สามารถนับได้ว่าฉันถูกซ่อนด้วยจำนวนครั้งที่มีแบ็กสแลชไม่เพียงพอ สิ่งนี้เลวร้ายยิ่งกว่าการไม่สามารถเข้าถึงคุณสมบัติ Unicode ใด ๆ จากสหัสวรรษนี้ - ซึ่งเป็นวัวที่สมบูรณ์ สิบปีที่ล้าสมัย !!! ไร้ประโยชน์โดยสิ้นเชิง ทิ้งขยะ
จากนั้นมีข้อบกพร่องที่ทางลัดคลาสอักขระไม่ทำงานบนไม่ใช่ ASCII ช่างเป็นความเจ็บปวด! และไม่ได้พิจารณาการใช้\p{javaWhiteSpace}
; มันไม่ได้ทำสิ่งที่ถูกต้องกับจุดรหัสช่องว่าง Unicode ที่พบบ่อยมาก
คุณรู้หรือไม่ว่ามี\p{javaJavaIdentifierStart}
ทรัพย์สิน? พวกเขากำลังคิดอะไรอยู่? ดีใจที่พวกเขามีนักสำรวจสมาร์ทเช่น wurkin ในเรื่องที่ยาก
เคยลองใช้ธง CANON_EQ ไหม คุณรู้หรือไม่ว่าทำจริงและไม่ทำอะไร? แล้วเรื่องที่เรียกว่า“ Unicode case”? สิ่งต่าง ๆ ที่ห่อหุ้มตามปกติไม่ได้ผล
จากนั้นพวกเขาทำให้การเขียน regexes ที่บำรุงรักษาทำได้ยาก Java ยังไม่เข้าใจวิธีการเขียนสตริงหลายบรรทัดดังนั้นคุณจะต้องเขียนสิ่งที่ไม่ดีเช่นนี้:
"(?= ^ [A-Z] [A-Za-z0-9\\-] + $) \n"
+ "(?! ^ .* \n"
+ " (?: ^ \\d+ $ \n"
+ " | ^ [A-Z] - [A-Z] $ \n"
+ " | Invitrogen \n"
+ " | Clontech \n"
+ " | L-L-X-X \n"
+ " | Sarstedt \n"
+ " | Roche \n"
+ " | Beckman \n"
+ " | Bayer \n"
+ " ) # end alternatives \n"
+ ") # end negated lookahead \n"
บรรทัดใหม่เหล่านั้นคืออะไร โอ้เพียงแค่ความโง่เขลาของ Java พวกเขาใช้ความคิดเห็น Perl ไม่ใช่ความคิดเห็น Java ( iDiots! ) ซึ่งไปจนถึงจุดสิ้นสุดของบรรทัด ดังนั้นหากคุณไม่ใส่สิ่งเหล่านั้นไว้\n
คุณจะตัดส่วนที่เหลือของแบบแผนของคุณออก Duh และ double duh!
อย่าใช้ regexes ใน Java: คุณแค่อยากจะทุบสิ่งต่าง ๆ มันเจ็บปวดและพังทลาย ฉันไม่อยากจะเชื่อว่าผู้คนจะทนกับเรื่องนี้ บางคนทำไม่ได้
จากนั้นเราสามารถเริ่มพูดถึงเรื่องไร้สาระของ Java ด้วยการเข้ารหัส สิ่งแรกคือความจริงที่ว่าการเข้ารหัสแพลตฟอร์มเริ่มต้นนั้นเป็นการเข้ารหัสแบบ 8 บิตที่อ่อนแอเสมอแม้ว่า charchars ของ Java จะเป็น Unicode ก็ตาม จากนั้นมีวิธีที่พวกเขาไม่ยกข้อยกเว้นเกี่ยวกับข้อผิดพลาดในการเข้ารหัส คุณรับประกันว่าจะได้รับอึ หรือวิธีการเกี่ยวกับเรื่องนี้:
OutputStreamWriter(OutputStream out)
Creates an OutputStreamWriter that uses the default character encoding.
OutputStreamWriter(OutputStream out, Charset cs)
Creates an OutputStreamWriter that uses the given charset.
OutputStreamWriter(OutputStream out, CharsetEncoder enc)
Creates an OutputStreamWriter that uses the given charset encoder.
OutputStreamWriter(OutputStream out, String charsetName)
Creates an OutputStreamWriter that uses the named charset.
ความแตกต่างคืออะไร? คุณรู้หรือไม่ว่ามีเพียงหนึ่งข้อเท่านั้นที่จะเพิ่มข้อยกเว้นหากคุณมีข้อผิดพลาดในการเข้ารหัส ที่เหลือก็แค่ปากกระบอกปืนพวกมัน
จากนั้นก็มีความโง่ของตัวอักษร Java ที่ไม่เพียงพอที่จะถือตัวละคร! พวกเขากำลังคิดอะไรอยู่? นั่นเป็นเหตุผลที่ฉันเรียกพวกเขาว่า charchars คุณต้องเขียนโค้ดแบบนี้หากคุณคาดหวังว่ามันจะทำงานได้ถูกต้อง:
private static void say_physical(String s) {
System.out.print("U+");
for (int i = 0; i < s.length(); i++) {
System.out.printf("%X", s.codePointAt(i));
if (s.codePointAt(i) > Character.MAX_VALUE) { i++; } // UG!
if (i+1 < s.length()) { System.out.printf("."); }
}
}
และใครที่เคยคิดที่จะทำเช่นนั้น? ถัดจากไม่มีใครเลย
มีอักขระกี่ตัว"\uD83D\uDCA9"
? หนึ่งหรือสอง? ขึ้นอยู่กับว่าคุณจะนับมันอย่างไร หลักสูตรของ regex เกี่ยวข้องกับตัวอักษรแบบโลจิคัลดังนั้นรูปแบบ^.$
จะประสบความสำเร็จและรูปแบบ^..$
จะล้มเหลว ความบ้านี้แสดงให้เห็นที่นี่:
String { U+61, "\u0061", "a" } =~ /^.$/ => matched.
String { U+61, "\u0061", "a" } =~ /^..$/ => failed.
String { U+61.61, "\u0061\u0061", "aa" } =~ /^.$/ => failed.
String { U+61.61, "\u0061\u0061", "aa" } =~ /^..$/ => matched.
String { U+DF, "\u00DF", "ß" } =~ /^.$/ => matched.
String { U+DF, "\u00DF", "ß" } =~ /^..$/ => failed.
String { U+DF.DF, "\u00DF\u00DF", "ßß" } =~ /^.$/ => failed.
String { U+DF.DF, "\u00DF\u00DF", "ßß" } =~ /^..$/ => matched.
String { U+3C3, "\u03C3", "σ" } =~ /^.$/ => matched.
String { U+3C3, "\u03C3", "σ" } =~ /^..$/ => failed.
String { U+3C3.3C3, "\u03C3\u03C3", "σσ" } =~ /^.$/ => failed.
String { U+3C3.3C3, "\u03C3\u03C3", "σσ" } =~ /^..$/ => matched.
String { U+1F4A9, "\uD83D\uDCA9", "💩" } =~ /^.$/ => matched.
String { U+1F4A9, "\uD83D\uDCA9", "💩" } =~ /^..$/ => failed.
String { U+1F4A9.1F4A9, "\uD83D\uDCA9\uD83D\uDCA9", "💩💩" } =~ /^.$/ => failed.
String { U+1F4A9.1F4A9, "\uD83D\uDCA9\uD83D\uDCA9", "💩💩" } =~ /^..$/ => matched.
ความโง่เง่านั้นเป็นเพราะคุณไม่สามารถเขียนสิ่งที่สมเหตุสมผลอย่างสมบูรณ์\u1F4A9
และแน่นอนคุณไม่ได้รับคำเตือนใด ๆ ที่คุณไม่สามารถทำได้ มันแค่ทำสิ่งผิด
Stoooopid
ในขณะที่เราอยู่ที่มัน\uXXXX
สัญกรณ์ทั้งหมดเป็นสมองพิการ แต่กำเนิด ตัวประมวลผลล่วงหน้า Java ( ใช่คุณได้ยินฉัน ) มาถึงก่อนที่ Java จะทำดังนั้นคุณจึงไม่ได้รับอนุญาตให้เขียนสิ่งที่สมเหตุสมผลอย่างสมบูรณ์เช่น"\u0022"
เนื่องจากเมื่อ Java เห็นว่าตัวประมวลผลล่วงหน้าได้กลายเป็น"""
ดังนั้นคุณจะสูญเสีย เดี๋ยวก่อนไม่ใช่ว่าอยู่ใน regex! ดังนั้นคุณสามารถใช้งานได้"\\u0022"
ดี
Riiiiiiiight!
คุณรู้หรือไม่ว่า Java ไม่สามารถisatty(0)
โทรออกได้ คุณไม่ได้รับอนุญาตให้คิดความคิดเช่นนั้น มันจะไม่ดีสำหรับคุณ
และจากนั้นก็มีสิ่งที่น่ารังเกียจ classpath ทั้งหมด
หรือความจริงที่ว่าไม่มีวิธีที่จะระบุการเข้ารหัสของไฟล์ต้นฉบับ Java ของคุณในไฟล์ต้นฉบับเดียวกันดังนั้นคุณจะไม่สูญเสียมัน ฉันต้องการทราบอีกครั้งว่าอะไรที่พวกเขาคิดว่าดี
หยุดความบ้าคลั่ง! ฉันไม่อยากเชื่อเลยว่าผู้คนจะทนกับขยะนี้ได้ มันเป็นเรื่องตลกที่สมบูรณ์ ฉันอยากจะเป็นวอล - มาร์ทมากกว่าที่จะต้องทนทุกข์ทรมานกับการถูกเชือดและลูกธนูของความบ้าคลั่งของชวา ทุกอย่างพังทลายและพวกเขาไม่สามารถแก้ไขได้ แต่ไม่สามารถแก้ไขได้
สิ่งนี้เกิดขึ้นได้จากคนที่ชอบสุนัขจิ้งจอกคนเดียวที่มีความภาคภูมิใจในภาษาที่ทำให้มันผิดกฎหมายที่จะมีprintf()
ฟังก์ชั่น Gee นั้นได้ผลจริงดีใช่มั้ย!
เชียร์ numbskulls Bitch-slapping นั้นใจดีเกินไปสำหรับพวกเขา ถ้าฉันต้องการที่จะเขียนโปรแกรมในการประกอบฉันจะ นี่ไม่ใช่ภาษาที่ใช้กู้ได้ จักรพรรดิไม่มีเสื้อผ้า
เราเกลียดมัน เราเกลียดมันตลอดไป ปล่อยให้มันตายตายตาย !