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


25

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

มันทำให้ฉันสงสัยว่าทำไมผู้คนถึงยอมรับทัศนคติที่ว่า "คุณเป็นโนบ ฉันถูกกล่าวหาว่าเขียน C ++ เหมือนกับว่าเป็น Java สิ่งที่ฉันไม่เข้าใจและยังทำให้ฉันงุนงง

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

ฉันออกแบบรหัสของฉันก่อนที่ฉันจะเขียนบรรทัดเดียว ในการกำหนดการทดสอบฉันทำรายการเป้าหมายของชั้นเรียนหนึ่ง ๆ และเกณฑ์การทดสอบที่ต้องปฏิบัติตาม เพราะฉันจะสร้างไดอะแกรมลำดับและเขียนรหัสได้ง่ายขึ้นฉันเลือกที่จะเขียนการทดสอบหลังจากที่อินเทอร์เฟซกลายเป็นที่ชัดเจน

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

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

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

คำถามคือ: ทำไมคนที่ไม่ได้ใช้รูปแบบการเข้ารหัสของคุณเย้ยหยัน?

เรื่อง / เขตการปกครองในมือสำหรับฉันคือ:

  • เหตุใดจึงเป็นการฝึกเขียนโปรแกรมที่ไม่ถูกต้องเพื่อใช้รหัสผิดพลาดได้ง่ายขึ้นในสถานการณ์ต้นแบบหากการปรับโครงสร้างทำให้มันแข็งแกร่งขึ้นในเวลาต่อมา
  • โปรแกรมที่เขียนใน C ++ จะเป็นอย่างไรเหมือนเขียนใน Java อะไรทำให้เป็นโปรแกรมที่ไม่ดี (เมื่อพิจารณาว่าฉันระบุเจตนาของรูปแบบปัจจุบันและงานที่วางแผนไว้เพื่อปรับปรุง)
  • ฉันจะเป็นมืออาชีพที่ไม่ดีได้อย่างไรถ้าฉันเลือกใช้โครงสร้างที่ใช้ในกระบวนทัศน์การเขียนโปรแกรมบางอย่าง (เช่น OOP / DP)

[1] พัฒนาอย่างรวดเร็วและบั๊กกี้จากนั้นแก้ไขข้อผิดพลาดหรือช้าระวังสำหรับโค้ดแต่ละบรรทัด?


5
คุณน่าจะดีกว่าถ้าถามคนใน The C ++ Lounge คำถามนี้ ใส่ชุดป้องกันไฟของคุณก่อน
Robert Harvey

48
คน C ++ เป็นสายพันธุ์ที่ผิดปกติในหมู่โปรแกรมเมอร์ ชุดเครื่องมือ Java ของคุณเป็นกล่องเครื่องมือที่มีความเข้าใจดีและมีเครื่องมือที่คุ้นเคยในเคสหนังหุ้มเบาะที่จะทำงานในร้านขายเครื่องมือใด ๆ C ++ เป็นเครื่องมือทั้งหมดที่มีเลื่อยตัด, สว่านไฟฟ้าและเครื่องมือบางอย่างที่ไม่มีใครจำได้ซึ่งฝูงชน C ++ ทั้งหมดสามารถจัดการได้เหมือนกับนินจา มันรบกวนพวกเขาเมื่อมีคนเข้ามาและวางเครื่องมือบางอย่างบนชั้นวางในที่ที่ผิด มันคือ "การวัดสองครั้งตัดครั้งเดียว" ของโปรแกรมเมอร์
Robert Harvey

13
บางทีมันอาจเป็นปฏิกิริยาเดียวกับที่คุณต้องใช้กับโค้ด Java ที่เขียนเหมือน FORTRAN: โค้ดทั้งหมดในคลาสเดียวไม่มีคอลเลกชันเฉพาะอาร์เรย์ที่มีขนาดคงที่พร้อมด้วยintตัวแปรแยกต่างหาก
kevin cline

14
หากคุณเขียน C ++ เช่น Java คุณอาจจะได้รับการจัดสรรฮีพมากเกินไปซึ่งจะทำให้โปรแกรมของคุณทำงานได้ไม่ดีเท่าที่ควร ภาษามีแนวโน้มที่จะได้รับการออกแบบและปรับให้เหมาะสมเพื่อส่งเสริมรูปแบบบางอย่างและหากคุณแบ่งรูปแบบเหล่านั้นสิ่งต่าง ๆ จะมีแนวโน้มแย่ลงสำหรับคุณ
Gort the Robot

5
คุณโพสต์รหัสออนไลน์เพื่อรับความช่วยเหลือในรูปแบบใด ฉันรู้ว่าคุณไม่ต้องการ / คาดหวังความคิดเห็นทั้งหมดในสไตล์ของคุณ แต่คุณต้องการความช่วยเหลือหรือไม่? คุณเอาดีกับความเลว โปรแกรมเมอร์ต้องมองหาข้อบกพร่องในรหัส มันคือสิ่งที่เราทำ
JeffO

คำตอบ:


26

หากไม่เห็นรหัสที่เป็นปัญหาจะมีวิธีการเขียนโค้ด Java ใน C ++ บางวิธีที่แย่กว่าวิธีอื่น ๆ

  1. ที่สุดโต่งหนึ่งเดียวก็มีการจัดวางแหล่งที่มาของคุณเช่น Java: ทุกอย่างในไฟล์เดียวทุกอย่างที่อยู่ในคำจำกัดความของชั้นเรียน ฯลฯ :
    class HelloWorldApp {
    public:
        void main() {
            cout << "Hello World!" << endl;
        }
    };
    นี่คือวิธีการที่จะวางแหล่ง Java เป็นเทคนิคทางกฎหมายใน C ++ แต่การใส่ทุกอย่างลงในไฟล์ส่วนหัวและทุกอย่างอินไลน์ (โดยการกำหนดในการประกาศคลาส) เป็นสไตล์ที่แย่มากและจะฆ่าประสิทธิภาพการคอมไพล์ของคุณ อย่าทำมัน
  2. OO มากเกินไป - ในการใช้งานเกินขนาดใน Java มันเป็นราชอาณาจักรของคำนามที่ทุกอย่างเป็นวัตถุ รหัส C ++ ที่ดี (เช่นเป็นสำนวน) มีแนวโน้มที่จะใช้ฟังก์ชั่นฟรีเท็มเพลต ฯลฯ แทนที่จะพยายามยัดทุกอย่างลงในวัตถุ
  3. ไม่มี RAII - คุณพูดถึงเรื่องนี้แล้ว - ใช้ตัวชี้และการล้างข้อมูลด้วยตนเองแทนการใช้ตัวชี้อัจฉริยะ C ++ ให้เครื่องมือเช่น RAII และสมาร์ทพอยน์เตอร์ดังนั้นรหัส C ++ ที่ดี (เช่นเป็นสำนวน) ใช้เครื่องมือเหล่านั้น
  4. ไม่มี C ++ ขั้นสูง - พื้นฐานของ Java และ C ++ นั้นคล้ายคลึงกันมากพอ แต่เมื่อคุณได้รับฟีเจอร์ขั้นสูงเพิ่มเติม (เทมเพลต, ไลบรารีอัลกอริทึมของ C ++ เป็นต้น) พวกมันจะเริ่มแตกต่างกัน

ยกเว้น # 1 สิ่งเหล่านี้ไม่ได้ทำให้โปรแกรม C ++ เป็นโปรแกรมที่ไม่ดี แต่มันก็ไม่ใช่รหัสที่ฉันชอบทำงานในฐานะโปรแกรมเมอร์ C ++ (ฉันจะไม่สนุกกับการทำงานกับ Perl แบบไม่ใช้สำนวนหรือ C-style, Python แบบไม่ใช้สำนวน ฯลฯ ) ภาษามีเครื่องมือและสำนวนและปรัชญาของตัวเองและรหัสที่ดีใช้เครื่องมือและสำนวนเหล่านั้นแทนการพยายามใช้ ตัวหารร่วมที่ต่ำที่สุดหรือพยายามสร้างวิธีการของภาษาอื่น การเขียนโค้ดที่ไม่ใช้สำนวนในภาษา / โดเมนปัญหา / อะไรก็ตามที่ไม่ได้ทำให้ใครบางคนเป็นโปรแกรมเมอร์ที่ไม่ดีมันก็หมายความว่าพวกเขามีมากขึ้นที่จะเรียนรู้เกี่ยวกับภาษา / โดเมนปัญหา / อะไรก็ตาม และไม่มีอะไรผิดปกติกับสิ่งนั้น มีรายการสิ่งต่าง ๆ ที่ฉันต้องเรียนรู้อีกมากและโดยเฉพาะอย่างยิ่งภาษาซีพลัสพลัสนั้นมีสิ่งที่ต้องเรียนรู้มากมาย

เกี่ยวกับคำถามเฉพาะในการเขียนรหัสข้อผิดพลาดโดยมีจุดประสงค์เพื่อล้างข้อมูลในภายหลังไม่ใช่ขาวดำ:

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

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


11
มี perl สำนวน?
วงล้อประหลาด

21
@ ไม่เมื่อคุณถามว่า "ฉันจะตอกตะปูเกลียวนี้เข้ากับผนังโดยไม่ทำให้โค้งงอได้อย่างไร" ทุกคนจะบอกคุณว่าอย่าใช้ค้อน
Sjoerd

9
@Onno ใน C ++ หมายถึงพอยน์เตอร์และnewถือว่าเป็น powertools ที่เก็บข้อมูลอัตโนมัติคือ handtool
Sjoerd

9
@ ไม่ได้: คุณต้องตระหนักว่าหลักสูตรการเขียนโปรแกรม C ++ มีแนวโน้มที่จะล่าช้าในการใช้สำนวนที่ทันสมัยและสิ่งที่ถือว่าเป็น C ++ ที่ดีนั้นก็มีการพัฒนาอย่างมากตั้งแต่ C ++ ถูกคิดค้นขึ้นมา
Bart van Ingen Schenau

7
เนื่องจากประวัติของ C ++ และผู้เขียนโค้ดจำนวนมากที่เรียนภาษาก่อนที่คุณสมบัติขั้นสูงของภาษาจะปรากฏขึ้นทำให้มีคนเส็งเคร็ง C ++ มากมายที่ยังคงถูกเขียนโดยคนที่เขียนเหมือนพวกเขาเมื่อสิบปีก่อน ความน่าเบื่อหน่ายเกี่ยวกับสิ่งต่าง ๆ เช่น RAII กำลังทำให้ทุกคนใช้วิธีการที่ทันสมัยเพื่อให้เราสามารถหยุดเห็นความล้มเหลวที่คาดเดาได้แบบเดียวกัน
Gort the Robot

42

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

  • ฉันจะตะโกนถ้าคุณเขียนfor ($i = 0; $i < 42; $i++) { … }ใน Perl แต่ไม่ใช่ใน PHP
    (ใน Perl ควรประกาศตัวแปรและวนซ้ำดังกล่าวควรซ้ำในช่วง)
  • ฉันจะร้องไห้ถ้าคุณเขียนnew Foo()ใน C ++ โดยไม่มีเหตุผลที่ดี แต่ไม่ใช่ใน Java
    (C ++ ไม่มีการรวบรวมขยะดังนั้นควรใช้ RAII Noobs จะรั่วไหลของหน่วยความจำอย่างอื่น)
  • ฉันจะประจบประแจงถ้าคุณประกาศตัวแปรทั้งหมดของคุณที่ด้านบนของฟังก์ชั่นของคุณยกเว้นใน C89, Pascal หรือ JavaScript
  • ฉันจะ facepalm ถ้าคุณใส่ฟังก์ชั่นทั้งหมดของคุณในคลาสใน Python แต่ไม่ใช่ใน Java
    (Python เป็นภาษาแบบหลายกระบวนทัศน์แทนที่จะบังคับให้“ OOP” และรองรับฟังก์ชั่นที่ระดับบนสุด)
  • ฉันจะร้องไห้ถ้าคุณreturn nullอยู่ในสกาล่า แต่ไม่ใช่ในภาษา C ใด ๆ
    (เพราะสกาลามีOptionประเภท)
  • ฉันจะบ่นถ้าคุณเขียนอัลกอริทึมแบบเรียกซ้ำใน Java แต่ไม่ได้อยู่ใน OCaml
    (เพราะสแตกของ Java ล้นอย่างรวดเร็วในขณะที่ OCaml มีการเพิ่มประสิทธิภาพการโทรหาง)
  • ...

มันง่ายที่จะใช้ภาษาใหม่ราวกับว่ามันเป็นสิ่งที่คุณรู้และโชคก็ยังใช้งานได้ “ คุณสามารถเขียน Fortran ในภาษาใดก็ได้” แต่คุณไม่ต้องการเพิกเฉยต่อคุณสมบัติเฉพาะที่ภาษา X มีให้เนื่องจากโอกาสที่ดีที่ X จะมอบความได้เปรียบเหนือ U

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

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

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

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


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

4
@ Onno ประเด็นหลักของฉัน (ซึ่งตอบคำถามที่คุณถาม) คือคุณไม่สามารถอุ้มนิสัยจากภาษาหนึ่งและคิดว่ามันเป็นแนวปฏิบัติที่ดีที่สุดในอีกภาษาหนึ่งและการพยายามเขียนโค้ดที่สะอาดตั้งแต่เริ่มแรกนั้นดีกว่าการทำความสะอาด มันขึ้นมาในภายหลัง การล้างโค้ดให้ดีที่สุดเท่าที่คุณจะทำได้คือต้องขอความช่วยเหลือจากผู้อื่นก่อน (ดูsscce.orgสำหรับเคล็ดลับเกี่ยวกับตัวอย่างโค้ดที่ดี) การทิ้งโค้ดขยะบน SO ด้วย“ โปรดแก้ไขสิ่งนี้” นั้นเป็นสิ่งที่ยอมรับไม่ได้โดยเฉพาะถ้าคุณรู้ดีกว่า
amon

2
แต่เกี่ยวกับคำถามที่คุณกำลังพูดถึงอยู่: คำตอบของ jm666มีประเด็นสำคัญ: ปราชญ์คิดว่า“ ทำไมคุณถึงถาม X เกี่ยวกับ X ถ้าคุณไม่อยากเป็น X-guru ด้วยตัวเอง?” ฉันพบว่าตัวเองมักจะคิดมากเกินไป . วิธีที่เป็นไปได้ที่จะกลบเกลื่อนนั่นคือพูดถึงว่าคุณยังอยู่ที่จุดเริ่มต้นของช่วงการเรียนรู้และจะพิจารณาในภายหลัง แต่ตอนนี้มีคำถามเร่งด่วนนี้อยู่ในมือ อย่างไรก็ตามนั่นเป็นปัญหาการสื่อสารไม่ใช่ปัญหาการเขียนโปรแกรม
amon

6
ทั้ง C ++ และ C # มีoptional<T>และNullable<T>ตามลำดับ นอกจากนี้ในทางปฏิบัติทุกคนรั่วหน่วยความจำใน C ++ โดยไม่ต้อง RAII, noob หรือไม่
DeadMG

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

12

ฉันไม่ใช่นักพัฒนา C ++ ที่ไม่ยอมใครง่ายๆ แต่ ...

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

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

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

โปรแกรมที่เขียนใน C ++ จะเป็นอย่างไรเหมือนเขียนใน Java อะไรทำให้โปรแกรมไม่ดี

ฉันไม่คิดว่าจะมีคำตอบสำหรับสิ่งนี้ที่จะไม่เป็นการเก็งกำไรและความเห็นส่วนใหญ่ ถ้าคุณต้องการให้ฉันทำมันจาวามีแนวโน้มที่จะมีคู่ของคู่ค้าที่เชื่อมโยงกับความจริงที่ว่าทุกอย่างจะต้องเป็นวัตถุ ที่ไหนในภาษาอื่น ๆ ที่คุณต้องการผ่านตัวชี้ functor หรือฟังก์ชั่นใน Java คุณมักจะพบตันของว่างเปล่าและหวุดหวิดประโยชน์ThingDoers, FooFactoriesและIFrobnicatorsที่มีฟังก์ชั่นในการปลอมตัว

ในภาษาอื่นคุณอาจส่งผ่าน tuple หรือแบบไม่มีโครงสร้างแบบง่าย ๆ ใน Java เพื่อรวมวัตถุเพียง 2 ชิ้นไว้ในที่เก็บข้อมูลแบบง่ายคุณต้องกำหนดคลาส NamedThing 30+ บรรทัดด้วย setters, getters และ Javadocs การขาดคุณสมบัติสัมพัทธ์ของ Java ทำให้โปรแกรมเมอร์ต้องทำ backflips สองเท่าเชิงวัตถุ โค้ดที่ได้นั้นไม่ค่อยมีความหมายอะไรนอก Java

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

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


1
สิ่งนี้ได้รับการบรรเทาด้วย Java 8 - Lambdas ขี่เพื่อประหยัดส่วนใหญ่วัน :-)
Martijn Verburg

@ MartijnVerburg ตกลงก้าวไปข้างหน้าอย่างมาก แต่ปัญหาทางเทคโนโลยีเป็นเรื่องง่ายที่จะแก้ไข! นิสัยเก่า ๆ นั้นตายยากและตราบาปยิ่งกว่าเดิม Heck บางคนจะไปไกลถึงบ่น Java ไม่ต้องการคุณสมบัติ "ใหม่" เหล่านี้และมันเป็นเส้นทางที่จะกลายเป็น C ++ ถัดไป
Doval

ใช่ฉันมักจะส่ายหัวของฉันที่ - Java จะจงใจพัฒนาช้ากว่าภาษาอื่น ๆ เสมอเพราะมันเป็น workhorse ระยะยาว อย่างไรก็ตาม JVM สามารถกระโดดไปข้างหน้าด้วยการกระโดดได้เร็วขึ้นซึ่งเป็นสิ่งที่ทำให้แลมด้าสามารถใช้ภาษาได้ในที่สุด
Martijn Verburg

6

ปิดคำตอบของหัวข้อเล็กน้อย ...

ไม่ต้องกังวล - นี่เป็น "พฤติกรรม" ทั่วไปในชุมชนผู้เชี่ยวชาญใด ๆ ถ้าคุณเก่งภาษาใดภาษาหนึ่งและคุณจะพบรหัสว่า "แปลก" บางทีคุณก็อาจจะวิจารณ์ด้วยเช่นกัน (เพราะต้องการ TEACH)

ฉันอยู่ในโลก perl - เมื่อจะเห็นสิ่งที่ชอบ:

$imax=$#array;
$str=""
for($i=0; $i<$imax; $i++) {
    $str = "$str" . $array[$i];
}

แทน:

my $str = join '', @array;

แน่ใจว่าจะแสดงความคิดเห็น - (อ่าน: สอนผู้เขียน) เกี่ยวกับjoinฟังก์ชั่น

อย่างไรก็ตามการวิจารณ์ที่มากเกินไปนั้นเป็นการต่อต้านเลยและหนึ่งในตัวอย่างที่ดีที่สุดคือถัดไป: (คว้าจาก: http://perl-begin.org/humour/#How_can_I_switch_off_the_T.V..3F )

(บิตนี้ถูกโพสต์โดยไม่ระบุชื่อไปยัง pastebot เมื่อวันที่ 23 มีนาคม 2011 มันถูกวางไว้ที่นี่เพื่อลูกหลานหลังจากการแก้ไขบางส่วน) - แก้ไขเล็กน้อยเช่นกัน

คำถาม: ฉันจะเปิดทีวีได้อย่างไร

OP ต้องการได้ยินอะไร

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

คำตอบของผู้เชี่ยวชาญ #perl: อันดับแรกคุณหมายความว่าอย่างไรกับ "เปิด" กำหนดไว้ก่อน ลองดูทีวีรีโมททีวีและห้องนั่งเล่นของคุณด้วย

... หลังจากที่ไม่เป็นพิษเป็นภัย:

ห้องของคุณน่าเกลียด และทีวีดูแย่มาก ใช้ Mr. Clean บนหน้าจอและทำความสะอาดห้องนั่งเล่นของคุณก่อน ใช้ไม้ถูพื้นทำความสะอาดสามอันแทนสอง ใช้ HDMI และห้ามใช้ตัวเชื่อมต่อ scart (?) เว้นแต่คุณต้องการจริงๆ รีโมตทีวีของคุณมีปุ่มที่อ่านไม่ได้ทำความสะอาดก่อน คุณเป็นผู้เริ่มต้นดังนั้นอ่าน:

http://experts.blog/how_to_design_a_future_3D_TV.html http://experts.blog/the_basics_of_tv_repairing.html http://experts.blog/viruses_in_living_room_short_essay.html http://experts.blog/how_to_design_a_future_3D_TV.html

แขกของ IRC: แต่ฉันไม่ต้องการเป็นผู้เชี่ยวชาญด้านทีวี

คำตอบ: ทำไมคุณถึงต้องการเปิดทีวี?!


1
คำตอบนี้ไม่ได้อยู่นอกหัวข้อ มันอธิบายได้อย่างชัดเจนว่าทำไมบางคนวิจารณ์การใช้ภาษาอย่างไม่เป็นทางการและทำไมบางครั้งการวิจารณ์อัตโนมัติอาจไปไกลเกินไป ฉันชอบมัน.
trichoplax

1

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

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

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

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

ฉันจะเป็นมืออาชีพที่ไม่ดีได้อย่างไรถ้าฉันเลือกใช้โครงสร้างที่ใช้ในกระบวนทัศน์การเขียนโปรแกรมบางอย่าง (เช่น OOP / DP)

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

เหตุผลที่คุณได้รับการตอบกลับที่ไม่ดีคือคนส่วนใหญ่ใน SO มักจะตัดสินทักษะโดยวิธีการที่คุณสามารถใช้รหัสในภาษาที่คุณถาม คนที่คุ้นเคยกับ C ++ มักจะรู้สึกงงงวยเมื่อเห็นรหัสที่ไม่ดีซึ่งดูเหมือนว่าสิ่งที่เคยกัดพวกเขาในอดีต


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

1
@ ไม่: ตรงไปตรงมาไม่มีใครรู้หรือใส่ใจว่าคุณกำลังติดตามสิ่งนั้นดีแค่ไหน คนส่วนใหญ่ที่เขียน C ++ ที่ดูเหมือน Java หรือ C นั้นไม่ได้พิถีพิถันนัก เป็นการดีกว่าสำหรับพวกเขาที่จะเรียนรู้การทำสิ่งที่ถูกต้องในครั้งแรกมากกว่าเขียนบันทึกย่อของตนเองเพื่อกลับไปแก้ไขในภายหลังเพราะประสบการณ์แสดงให้เห็นว่าพวกเขาไม่เคยทำมันจริง ๆ
cHao
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.