ตอบ:
Wikipedia มีบทความที่ยอดเยี่ยมเกี่ยวกับ Function Programming พร้อมด้วยตัวอย่างที่คุณขอ @ Konrad Rudolph ได้จัดเตรียมลิงก์ไปยังบทความ OOPแล้ว
ฉันไม่คิดว่ากระบวนทัศน์หนึ่งจะเป็นอีกฉากหนึ่งที่เหนือกว่า พวกเขามีมุมมองที่แตกต่างกันในการเขียนโปรแกรมและปัญหาบางอย่างสามารถแก้ไขได้ดีขึ้นจากมุมมองที่หนึ่งและบางส่วนจากที่อื่น
คำถามของคุณซับซ้อนยิ่งขึ้นโดยการนำ FP และ OOP ไปปฏิบัติทั้งหมด แต่ละภาษามีนิสัยใจคอของตนเองที่เกี่ยวข้องกับคำตอบที่ดีสำหรับคำถามของคุณ
การท่องเที่ยวเชิงเปรียบเทียบที่เพิ่มมากขึ้น:
ฉันชอบความคิดที่ว่าภาษาอย่างสกาล่าพยายามที่จะให้สิ่งที่ดีที่สุดแก่คุณทั้งสองโลก ฉันกังวลว่ามันจะช่วยให้คุณมีภาวะแทรกซ้อนของทั้งสองโลกเช่นกัน
Java เป็นภาษา OO แต่เวอร์ชัน 7 ได้เพิ่มคุณสมบัติ "ลองกับทรัพยากร" ซึ่งสามารถใช้ในการเลียนแบบการปิด ที่นี่มันลอกเลียนแบบการปรับปรุงตัวแปรท้องถิ่น "a" ที่อยู่ตรงกลางของฟังก์ชั่นอื่นโดยไม่ทำให้ฟังก์ชั่นนั้นมองเห็นได้ ในกรณีนี้ครึ่งแรกของฟังก์ชั่นอื่น ๆ คือคอนสตรัคเตอร์ ClosureTry () และครึ่งหลังเป็นเมธอด close ()
public class ClosureTry implements AutoCloseable {
public static void main(String[] args) {
int a = 1;
try(ClosureTry ct = new ClosureTry()) {
System.out.println("Middle Stuff...");
a = 2;
}
System.out.println("a: " + a);
}
public ClosureTry() {
System.out.println("Start Stuff Goes Here...");
}
/** Interface throws exception, but we don't have to. */
public void close() {
System.out.println("End Stuff Goes Here...");
}
}
เอาท์พุท:
Start Stuff Goes Here...
Middle Stuff...
End Stuff Goes Here...
a: 2
สิ่งนี้อาจเป็นประโยชน์สำหรับจุดประสงค์ในการเปิดสตรีมการเขียนไปยังสตรีมและการปิดสตรีมอย่างน่าเชื่อถือหรือเพียงแค่จับคู่สองฟังก์ชั่นในแบบที่คุณไม่ลืมที่จะเรียกสายที่สองหลังจากทำงานระหว่างพวกเขา . แน่นอนว่ามันแปลกใหม่และไม่ธรรมดาที่โปรแกรมเมอร์รายอื่นอาจลบบล็อกลองโดยไม่ทราบว่าพวกเขากำลังทำลายบางสิ่งบางอย่างดังนั้นในปัจจุบันจึงเป็นรูปแบบการต่อต้าน แต่ก็น่าสนใจที่สามารถทำได้
คุณสามารถแสดงลูปใด ๆ ในภาษาที่มีความจำเป็นมากที่สุดเป็นการเรียกซ้ำ วัตถุและตัวแปรสามารถทำให้ไม่เปลี่ยนรูป Procecures สามารถเขียนเพื่อลดผลข้างเคียง (แม้ว่าฉันจะยืนยันว่าฟังก์ชั่นที่แท้จริงเป็นไปไม่ได้ในคอมพิวเตอร์ - เวลาที่ใช้ในการดำเนินการและทรัพยากรตัวประมวลผล / ดิสก์ / ระบบที่สิ้นเปลืองนั้นเป็นผลข้างเคียงที่หลีกเลี่ยงไม่ได้) ภาษาที่ใช้งานได้บางภาษาสามารถทำได้หลายอย่างหากไม่ใช่การดำเนินการกับวัตถุทั้งหมด ไม่จำเป็นต้องใช้ร่วมกัน แต่บางภาษามีข้อ จำกัด (เช่นไม่อนุญาตให้อัปเดตตัวแปร) ที่ป้องกันรูปแบบบางอย่าง (เช่นฟิลด์ที่ไม่แน่นอน)
สำหรับฉันส่วนที่มีประโยชน์ที่สุดของการเขียนโปรแกรมเชิงวัตถุคือการซ่อนข้อมูล (ห่อหุ้ม) รักษาวัตถุที่คล้ายกันมากพอ ๆ กัน (polymorphism) และรวบรวมข้อมูลและวิธีการของคุณที่ทำงานกับข้อมูลนั้นร่วมกัน (object / classes) การสืบทอดอาจเป็นธงของ OOP แต่สำหรับฉันแล้วมันเป็นส่วนที่สำคัญที่สุดและใช้น้อยที่สุด
ส่วนที่มีประโยชน์ที่สุดของการโปรแกรมเชิงฟังก์ชันคือความไม่สามารถเปลี่ยนแปลงได้ (โทเค็น / ค่าแทนตัวแปร), ฟังก์ชั่น (ไม่มีผลข้างเคียง) และการปิด
ฉันไม่คิดว่ามันเป็นวัตถุ แต่ฉันต้องบอกว่าหนึ่งในสิ่งที่มีประโยชน์ที่สุดในวิทยาการคอมพิวเตอร์คือความสามารถในการประกาศอินเทอร์เฟซจากนั้นก็มีฟังก์ชั่นการใช้งานและข้อมูลที่หลากหลาย ฉันยังต้องการให้มีข้อมูลบางส่วนที่เปลี่ยนแปลงได้ดังนั้นฉันคิดว่าฉันไม่ได้รู้สึกสบายใจกับภาษาที่ใช้งานได้โดยเฉพาะแม้ว่าฉันจะพยายาม จำกัด ความไม่แน่นอนและผลข้างเคียงในการออกแบบโปรแกรมทั้งหมดของฉัน