การเรียนรู้ภาษาที่ใช้งานได้จะทำให้โปรแกรมเมอร์ OOP ดีขึ้นหรือไม่ [ปิด]


28

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

มีใครยืนยันได้ไหม มันพัฒนาทักษะการเขียนโปรแกรมของคุณในทางใดบ้าง

อะไรคือตัวเลือกที่ดีของภาษาในการเรียนรู้โดยมีเป้าหมายเพื่อพัฒนาทักษะในภาษาที่ซับซ้อนน้อยกว่า?


3
หากคุณกำลังเข้ารหัสใน C # คุณก็รู้อยู่แล้ว LINQ ค่อนข้างใช้งานได้
SK-logic

ฉันคิดว่า OOP ดีกว่าสำหรับการสร้างแบบจำลองวัตถุในชีวิตจริง
Tulains Córdova

1
@ user61852 รูปแบบการออกแบบ OO ส่วนใหญ่จะไม่สร้างแบบจำลองเกี่ยวกับวัตถุ "ชีวิตจริง" แต่จริงๆแล้วเป็นแนวคิดที่เป็นนามธรรมสูง
Andres F.

เป็นมากกว่าโปรแกรมเมอร์ Java / C # (+ C ++) มีความแตกต่างระหว่างมีดสวิสกองทัพขนาดยักษ์ที่มีแผ่นพับเล็ก ๆ น้อย ๆ ที่อธิบายว่าทำไมคุณถึงเลือก Blade X จาก 40 และใบมีดที่คุณสามารถแกะสลักออกมาด่าอะไรก็ได้ตามที่คุณต้องการเพราะทั้งคมและโค้ง ถูกต้องที่คุณสามารถใช้มันกำลังตัดกับสถานการณ์ที่หลากหลายโดยไม่ต้องคิดมาก (พร้อมที่เปิดขวดในมือจับแน่นอน)
Erik Reppen

คำตอบ:


32

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

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

ฉันสังเกตว่ารหัสของฉันรวมถึงผลข้างเคียงและฉันระมัดระวังในการแยกสถานที่เหล่านั้นออก สิ่งนี้ช่วยปรับปรุงความสามารถในการทดสอบโค้ด OO ของฉันอย่างมาก

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

ฉันมีแนวโน้มที่จะพึ่งพาการเรียกซ้ำ (โครงสร้างวนซ้ำแบบวนซ้ำเป็นสิ่งที่สวยงาม) Dijkstra ได้สัมผัสกับความสำคัญของสิ่งนี้ในNotes on Structured Programming - อัลกอริทึมแบบเรียกซ้ำทำแผนที่โดยตรงกับการอุปนัยทางคณิตศาสตร์ซึ่งเขาแนะนำว่าเป็นวิธีเดียวที่จะพิสูจน์สติปัญญาของเราได้อย่างถูกต้อง (ฉันไม่แนะนำให้เราต้องพิสูจน์รหัสของเราให้ถูกต้อง แต่ยิ่งเราทำให้ง่ายขึ้นสำหรับตัวเราเองยิ่งมีโอกาสมากที่รหัสของเรานั้นถูกต้อง)

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

นอกจากนี้เมื่อสัมผัสกับคำตอบของ Jettiคุณจะพบว่าความคิด FP จำนวนมากถูกรวมเข้ากับภาษา OO ที่ใหม่กว่า Ruby และ Python ทั้งสองมีฟังก์ชั่นการสั่งซื้อที่สูงขึ้นฉันได้ยิน LINQ อธิบายว่าเป็นความพยายามที่จะนำการสนับสนุนความเข้าใจแบบ monadic มาสู่ C # แม้ C ++ ในขณะนี้จะมีการแสดงออกแลมบ์ดา


@Aidan: wrt lambdas ใน C ++ 0x ในอัตราที่คอมไพเลอร์ C ++ ใหม่ได้รวมไว้แล้ว
Matthieu M.

1
"Object" เป็น "สิ่งที่มีสถานะที่ไม่แน่นอน" เป็นเรื่องธรรมดามาก แต่รูปแบบของ Object Value นั้นมีมาหลายปีแล้ว
Frank Shearar

@ Matthieu ขอบคุณฉันได้อัปเดตข้อความเพื่อแสดงว่า
Aidan Cully

@ Frank: ขอบคุณสำหรับตัวชี้ ฉันไม่ได้รวมสิ่งนี้ไว้ในคำตอบ แต่การคัดค้านหลักที่ฉันต้องสร้างคุณค่าให้กับวัตถุนั้นเกี่ยวข้องกับการแยกวัตถุ b / w ส่วนต่อประสานวัตถุ (ซึ่งเป็นของวัตถุ) และการดำเนินงาน (ซึ่งความสัมพันธ์ระหว่างวัตถุมากกว่า หลักกว่าวัตถุตัวเอง) 1 + 2เป็นทางคณิตศาสตร์เทียบเท่า2 + 1แต่มีการใช้งานที่แตกต่างกว่า1.+(2) 2.+(1)มีปัญหา SW จำนวนมากเกินกว่าที่จะเข้าใจได้อย่างเป็นธรรมชาติโดยใช้การดำเนินการมากกว่าการใช้วัตถุอินเตอร์เฟส
Aidan Cully

1
@Aidan คุณอ่าน "การทำความเข้าใจเกี่ยวกับข้อมูลที่เป็นนามธรรมของ Revis แล้ว" หรือไม่? มันนำเสนอความแตกต่างระหว่างวัตถุและ ADT ซึ่งเป็นสิ่งที่คุณพูดถึง
Frank Shearar

32

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


3
เนื่องจากวัตถุนั้นเป็นฟังก์ชั่นการสั่งซื้อที่สูงขึ้นฉันพบว่าการเรียนรู้สิ่งต่าง ๆ ของ FP ได้ช่วยโดยตรงกับ OOP ของฉัน มันเป็นอย่างที่คุณพูดโดยทั่วไปว่ามีประโยชน์ / เป็นประโยชน์มากกว่า
Frank Shearar

12

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


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

ฉันไม่เคยได้ยินชื่อ Prolog ที่เรียกว่าภาษาที่ใช้งานได้ ถ้าฉันเหลื่อมกันมากพอฉันจะเห็นว่า Prolog สามารถช่วย FP ได้อย่างไร
Frank Shearar

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

@ เพียงแค่ความคิดเห็นที่ถูกต้องของฉัน: ใช่ฉันคิดว่าคุณพูดถูกต้องฉันต้องเรียนรู้เพิ่มเติมเกี่ยวกับภาษาที่ใช้งานได้!
Michael K

1
@moz: ใช่ฉันหวังว่า Java มีลูกแกะ Threadวัตถุที่ไม่เปิดเผยตัวคือ ... เงอะงะ
Michael K

9

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

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

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

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


3

ฉันเคยพูดมาแล้วและฉันจะพูดอีกครั้งการเรียนรู้ภาษาที่ใช้งานได้ดีขึ้นอย่างแน่นอน C # ของฉัน มันช่วยให้ฉันเข้าใจ lambdas (และช่วยให้ฉันรักพวกเขา) มันทำให้ฉันรู้ว่าฉันชอบฟังก์ชั่นการเขียนโปรแกรม (F #) มากแค่ไหนเมื่อทำงานกับการทำงานแบบอะซิงโครนัส!


3

รหัสเครื่องไม่มีอะไรเพิ่มเติมแล้วรายการของผลข้างเคียง - คำสั่งที่ประมวลผลโดยตรงโดยโปรเซสเซอร์ ผลข้างเคียงใน C นั้นแตกต่างกันแทนที่จะจัดการกับรีจิสเตอร์และฮาร์ดแวร์จริงคุณจัดการกับเซตของ abstractions และให้คอมไพเลอร์ทำงานสกปรกทั้งหมด C ยังช่วยให้คุณจัดโครงสร้างผลข้างเคียงของคุณเป็นลูปและถ้าเป็นเช่นนั้น C ++ ปรับปรุงตาม C โดยการเพิ่ม OOP และคุณสมบัติที่จำเป็นในภาษา Java และ C # เพิ่มการรวบรวมขยะและ Python เพิ่มการพิมพ์แบบไดนามิก

แม้จะมีคุณสมบัติเหล่านี้ทั้งหมด - การพิมพ์แบบไดนามิกการเก็บขยะ ฯลฯ โปรแกรมในภาษาเหล่านี้ยังคงขึ้นอยู่กับผลข้างเคียงทั้งหมด ภาษาโปรแกรมเชิงฟังก์ชั่นเช่น Scheme, Clojure, Haskell และ ML นั้นเป็นอะไรที่แตกต่างไปจากเดิมอย่างสิ้นเชิงภาษาเหล่านี้ใกล้เคียงกับคณิตศาสตร์และรหัสเครื่องจักร จากนั้นใช้ผลข้างเคียงที่คุณผ่านค่ารอบฟังก์ชั่น

อะไรคือตัวเลือกที่ดีของภาษาในการเรียนรู้โดยมีเป้าหมายเพื่อพัฒนาทักษะในภาษาที่ซับซ้อนน้อยกว่า?

ฉันแนะนำSchemeมันมีน้อยและถูกใช้ในคลาสการเขียนโปรแกรมเบื้องต้นของ MIT ภาษาการเขียนโปรแกรมฟังก์ชั่นอื่น ๆ นั้นยากที่จะเรียนรู้ Clojure นำความซับซ้อนทั้งหมดของ Java มาด้วย ML นำมาพร้อมกับระบบพิมพ์แบบคงที่ที่ซับซ้อนบางครั้ง Haskell ถูกเรียกว่าเป็นภาษาวิชาการ - มันไม่เหมาะสำหรับผู้เริ่มต้นและอื่น ๆ ในทางกลับกันโครงการง่ายต่อการเรียนรู้และเข้าใจ

มันพัฒนาทักษะการเขียนโปรแกรมของคุณในทางใดบ้าง

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

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