ภาษายอดนิยมอื่นจะหลีกเลี่ยงการใช้รูปแบบจากโรงงานในขณะที่จัดการความซับซ้อนที่คล้ายกันใน Java / Java EE อย่างไร


23

รูปแบบโรงงาน (หรืออย่างน้อยใช้FactoryFactory..) เป็นก้นของตลกจำนวนมากเช่นที่นี่

นอกเหนือจากการมี verbose และชื่อ "สร้างสรรค์" เช่น RequestProcessorFactoryFactory.RequestProcessorFactoryแล้วมีอะไรผิดปกติกับรูปแบบของโรงงานถ้าคุณต้องโปรแกรมใน Java / C ++ และมี usecase สำหรับAbstract_factory_pattern ?

ภาษายอดนิยมอื่นจะทำอย่างไร (เช่นRubyหรือScala ) จะหลีกเลี่ยงการใช้ภาษาในขณะที่จัดการความซับซ้อนที่คล้ายกันได้อย่างไร

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



4
ปัญหาไม่ใช่การใช้โรงงาน - มันเป็นรูปแบบที่ดีอย่างสมบูรณ์ มันมากเกินไปของโรงงานซึ่งเป็นที่แพร่หลายโดยเฉพาะอย่างยิ่งในโลก java enterprisey
CodesInChaos

ลิงค์ตลกที่ดีมาก ฉันชอบที่จะเห็นการตีความภาษาที่ใช้งานได้ในการดึงเครื่องมือเพื่อสร้างชั้นวางเครื่องเทศ ฉันคิดว่ามันจะขับรถกลับบ้าน
Patrick M

คำตอบ:


28

คำถามของคุณถูกแท็กด้วย "Java" ไม่ต้องแปลกใจที่คุณถามว่าทำไมรูปแบบ Factory ถึงถูกเยาะเย้ย: Java เองมาพร้อมกับการละเมิดที่ทำมาอย่างดีของรูปแบบนั้น

ตัวอย่างเช่นลองโหลดเอกสาร XML จากไฟล์และเรียกใช้แบบสอบถาม XPath เทียบกับมัน คุณต้องการโค้ด 10 บรรทัดเพื่อเซ็ตอัพ Factories and Builders:

DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = builderFactory.newDocumentBuilder(); 

Document xmlDocument = builder.parse(new FileInputStream("c:\\employees.xml"));
XPath xPath =  XPathFactory.newInstance().newXPath();

xPath.compile(expression).evaluate(xmlDocument);

ฉันสงสัยว่าคนที่ออกแบบ API นี้เคยทำงานเป็นนักพัฒนาซอฟต์แวร์หรือไม่หรือเพิ่งอ่านหนังสือและทำสิ่งต่าง ๆ ฉันเข้าใจว่าพวกเขาไม่ต้องการเขียนโปรแกรมแยกวิเคราะห์ตัวเองและออกจากงานให้ผู้อื่น แต่มันก็ยังทำให้การใช้งานน่าเกลียด

เนื่องจากคุณถามว่ามีทางเลือกอื่นอะไรในการโหลดไฟล์ XML ใน C #:

XDocument xml = XDocument.Load("c:\\employees.xml");
var nodes = xml.XPathSelectElements(expression);

ฉันสงสัยว่านักพัฒนา Java ที่เพิ่งแฮ็ตช์เห็นความบ้าคลั่งของ Factory และคิดว่ามันก็โอเคที่จะทำเช่นนั้น - หากอัจฉริยะที่สร้าง Java เองนั้นใช้มันมาก

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


1
โปรดทราบว่าทางเลือก C # ของคุณใช้ LINQ ใหม่กับ XML - ทางเลือก DOM ที่เก่ากว่าจะมีลักษณะดังนี้: XmlDocument xml = new XmlDocument(); xml.Load("c:\\employees.xml"); XmlNodeList nodes = xml.SelectNodes(expression); (โดยรวม LINQ ถึง XML นั้นใช้งานง่ายกว่ามาก แต่ส่วนใหญ่อยู่ในพื้นที่อื่น) และนี่คือบทความ KB ฉันพบด้วยวิธีที่ MS แนะนำ: support.microsoft.com/kb/308333
Bob

36

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

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

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

ระบบมีฐานข้อมูลที่ทำให้เป็นมาตรฐานในรูปแบบปกติที่ 5 (ฉันไม่ชอบคุณ)

ระบบที่มีความสำคัญมากกว่าสมุดที่อยู่เล็กน้อยที่สามารถใช้บันทึกและติดตามเอกสารขาเข้าและขาออกมีรหัสฐาน 100MB ใน C ++ และกว่า 50 ตารางฐานข้อมูล การพิมพ์จดหมาย 500 ฉบับจะใช้เวลานานถึง 72 ชั่วโมงโดยใช้เครื่องพิมพ์ที่เชื่อมต่อโดยตรงกับคอมพิวเตอร์ที่ใช้ซอฟต์แวร์

นั่นเป็นสาเหตุที่ผู้คนเย้ยหยันรูปแบบและโดยเฉพาะผู้คนที่มุ่งความสนใจไปที่รูปแบบที่เฉพาะเจาะจงอย่างเดียว


40
เหตุผลอีกประการหนึ่งคือรูปแบบ Gang of Four บางรูปแบบเป็นเพียงความสามารถในการพูดสิ่งที่สามารถทำได้อย่างไม่น่าเชื่อในภาษาที่มีฟังก์ชั่นชั้นหนึ่งซึ่งทำให้พวกเขาต่อต้านรูปแบบที่หลีกเลี่ยงไม่ได้ รูปแบบ "กลยุทธ์", "ผู้สังเกตการณ์", "โรงงาน", "คำสั่ง" และ "วิธีการเทมเพลต" นั้นไม่สามารถผ่านหน้าที่เป็นอาร์กิวเมนต์ได้ "ผู้เข้าชม" คือแฮ็คเพื่อทำการจับคู่รูปแบบกับการรวมประเภท / ตัวแปร / การรวมแท็ก ความจริงที่ว่าบางคนสร้างความกังวลใจอย่างมากเกี่ยวกับสิ่งที่ไม่สำคัญในภาษาอื่น ๆ เป็นสิ่งที่ทำให้คนเยาะเย้ย C ++, Java และภาษาที่คล้ายกัน
Doval

7
ขอบคุณสำหรับบทความนี้ คุณสามารถอธิบายเพิ่มเติมเกี่ยวกับ"ทางเลือกคืออะไร?" ส่วนหนึ่งของคำถามดังนั้นเราจึงไม่เป็นอย่างนั้นหรือ
Philipp

1
@Doval คุณสามารถบอกฉันได้อย่างไรว่าคุณจะคืนค่าจากคำสั่งที่ดำเนินการหรือกลยุทธ์ที่เรียกว่าเมื่อคุณสามารถผ่านฟังก์ชั่นเท่านั้น? และถ้าคุณบอกว่าปิดให้จำไว้ว่ามันเป็นสิ่งเดียวกับการสร้างคลาสยกเว้นชัดเจนมากขึ้น
ร่าเริง

2
@Eurhoric ฉันไม่เห็นปัญหาคุณสามารถทำอย่างละเอียดได้หรือไม่ ไม่ว่าในกรณีใดพวกเขาจะไม่เหมือนกัน คุณอาจจะพูดได้ว่าวัตถุที่มีเขตข้อมูลเดียวนั้นเหมือนกับตัวชี้ / การอ้างอิงถึงตัวแปรหรือว่าจำนวนเต็มนั้นเหมือนกับ enum จริง (จริง) มีความแตกต่างในทางปฏิบัติ: มันไม่มีเหตุผลที่จะเปรียบเทียบฟังก์ชั่น; ฉันยังไม่เห็นไวยากรณ์ที่รัดกุมสำหรับคลาสที่ไม่ระบุชื่อ และฟังก์ชั่นทั้งหมดที่มีอาร์กิวเมนต์เดียวกันและประเภทส่งคืนมีประเภทเดียวกัน (ไม่เหมือนคลาส / อินเทอร์เฟซที่มีชื่อแตกต่างกันซึ่งเป็นประเภทที่แตกต่างกันแม้ว่าจะเหมือนกัน)
Doval

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

17

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

WidgetFactory redWidgetFactory = new ColoredWidgetFactory(COLOR_RED);
Widget widget = redWidgetFactory.create();

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

WidgetBuilder widgetBuilder = new WidgetBuilder();
widgetBuilder.setColor(COLOR_RED);
Widget widget = widgetBuilder.create();

แต่เมื่อมีปัญหาเกี่ยวกับการ overengineering การแทนที่ Factory ด้วย Builder อาจไม่ได้รับการปรับปรุงมากนัก

การแทนที่แบบง่ายที่สุดสำหรับทั้งสองรูปแบบนั้นแน่นอนในการสร้างออบเจ็กต์อินสแตนซ์ด้วย Constructor แบบง่าย ๆ กับnewโอเปอเรเตอร์:

Widget widget = new ColoredWidget(COLOR_RED);

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

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

 Widget widget = Widget.createColoredWidget(COLOR_RED); // returns an object of class RedColoredWidget

คุณลักษณะใหม่ใน Java 8 เป็นการอ้างอิงวิธีการซึ่งช่วยให้คุณผ่านวิธีการต่างๆได้เหมือนกับที่คุณทำกับโรงงานไร้สัญชาติ สะดวกสิ่งใดก็ตามที่ยอมรับการอ้างอิงเมธอดยังยอมรับวัตถุใด ๆ ที่ใช้อินเทอร์เฟซการทำงานเดียวกันซึ่งสามารถเป็นโรงงานที่เต็มเปี่ยมด้วยสถานะภายในเพื่อให้คุณสามารถแนะนำโรงงานได้ในภายหลังเมื่อคุณเห็นเหตุผลในการทำเช่นนั้น


2
บ่อยครั้งที่โรงงานสามารถกำหนดค่าได้หลังจากการสร้าง ความแตกต่างที่สำคัญคือตัวสร้างคือตัวสร้างมักใช้เพื่อสร้างอินสแตนซ์ที่ซับซ้อนเดียวในขณะที่โรงงานใช้เพื่อสร้างอินสแตนซ์ที่คล้ายกันจำนวนมาก
Cephalopod

1
ขอบคุณ (+1) แต่คำตอบล้มเหลวในการอธิบายว่า PLs อื่นจะแก้ปัญหาอย่างไรอย่างไรก็ตามขอขอบคุณสำหรับการชี้ให้เห็นวิธีอ้างอิง Java 8
senseiwu

1
ฉันมักจะคิดว่ามันจะทำให้ความรู้สึกในกรอบเชิงวัตถุที่จะ จำกัด การก่อสร้างวัตถุที่เกิดขึ้นจริงกับประเภทในคำถามและมีความเทียบเท่ากับfoo = new Bar(23); foo = Bar._createInstance(23);วัตถุที่ควรจะสามารถเชื่อถือได้สอบถามประเภทของตัวเองโดยใช้ส่วนตัวgetRealType()วิธี แต่วัตถุที่ควรจะสามารถที่จะกำหนด supertype getType()ที่จะส่งกลับโดยการโทรออกไปข้างนอก โค้ดภายนอกไม่ควรสนใจว่าการโทรไปยังnew String("A")ส่งคืนอินสแตนซ์ของString[ตรงข้ามกับเช่นอินสแตนซ์ของSingleCharacterString] หรือไม่
supercat

1
ฉันใช้วิธีการแบบสแตติกจำนวนมากเมื่อฉันต้องเลือกคลาสย่อยตามบริบท แต่ความแตกต่างควรเป็นสีขุ่นสำหรับผู้โทร ตัวอย่างเช่นฉันมีชุดคลาสภาพที่มีdraw(OutputStream out)แต่สร้าง html ที่แตกต่างกันเล็กน้อยโรงงานวิธีแบบคงที่สร้างคลาสที่เหมาะสมสำหรับสถานการณ์จากนั้นผู้เรียกก็สามารถใช้วิธีการวาดได้
Michael Shopsin

1
@ supercat คุณอาจสนใจดูวัตถุประสงค์ -c [[SomeClass alloc] init]การก่อสร้างมีวัตถุประกอบด้วยวิธีการโทรง่ายมักจะ เป็นไปได้ที่จะส่งคืนอินสแตนซ์ของคลาสที่แตกต่างอย่างสิ้นเชิงหรือวัตถุอื่น (เช่นค่าแคช)
axelarge

3

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

บางคนใช้เวลานานเกินไปและพยายามออกแบบรหัสเพื่อไม่ต้องเรียกคอนสตรัคเตอร์ยกเว้นในโรงงาน สิ่งต่างๆเริ่มไร้สาระเมื่อคุณมีโรงงาน

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

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


ขอบคุณ (+1) คำตอบของคุณอธิบายถึงข้อสงสัยบางอย่างเกี่ยวกับวิธีที่สกาล่าจะหลีกเลี่ยงได้ สุจริตคุณไม่คิดว่าครั้งหนึ่ง (ถ้า) Scala กลายเป็นอย่างน้อยครึ่งหนึ่งที่เป็นที่นิยมเช่น Java ในระดับองค์กรแขนของกรอบรูปแบบรูปแบบเซิร์ฟเวอร์แอพจ่าย ฯลฯ จะปรากฏขึ้น?
senseiwu

ฉันคิดว่าถ้าสกาล่าต้องแซงหน้าจาวาก็คงเป็นเพราะผู้คนชื่นชอบ "สถาปัตยกรรมแบบสกาล่า" ของซอฟต์แวร์สถาปัตยกรรม สิ่งที่ทำให้ฉันมีความเป็นไปได้มากขึ้นคือ Java ยังคงใช้คุณสมบัติที่ขับเคลื่อนผู้คนให้เปลี่ยนไปใช้ Scala เช่น generics ของ Java 5 และ lambdas และลำธารของ Java 8 ซึ่งหวังว่าในที่สุดผู้เขียนโปรแกรมจะทิ้งรูปแบบการต่อต้าน คุณลักษณะไม่พร้อมใช้งาน จะมีสมัครพรรคพวก FactoryFactory เสมอไม่ว่าภาษาดีแค่ไหน เห็นได้ชัดว่าบางคนชอบสถาปัตยกรรมเหล่านั้นหรือพวกเขาจะไม่ธรรมดา
Karl Bielefeldt

2

โดยทั่วไปมีแนวโน้มว่าโปรแกรม Java นี้น่ากลัวเกินกว่าวิศวกรรม การมีโรงงานจำนวนมากเป็นหนึ่งในอาการที่พบได้บ่อยที่สุดของวิศวกรรมมากเกินไป นั่นเป็นสาเหตุที่ทำให้คนสนุกกับสิ่งเหล่านั้น

โดยเฉพาะอย่างยิ่งปัญหาที่ Java มีกับโรงงานคือใน Java a) constructors ไม่ใช่ function และ b) function ไม่ใช่พลเมืองชั้นหนึ่ง

ลองนึกภาพคุณสามารถเขียนสิ่งนี้ (ปล่อยให้Functionเป็นส่วนต่อประสานที่รู้จักกันดีของJRE )

// Framework code
public Node buildTree(Function<BranchNode, Node, Node> branchNodeFactory) {
    Node current = nextNode();
    while (hasNextNode()) {
        current = branchNodeFactory.call(current, nextNode());
    }
    return current
}

// MyDataNode.java
public class MyBranchNode implements BranchNode {

    public MyBranchNode(Node left, Node right) { ... }
}

// Client code
Node root = buildTree(MyBranchNode::new);

ดูไม่มีอินเทอร์เฟซหรือคลาสจากโรงงาน ภาษาไดนามิกจำนวนมากมีฟังก์ชั่นชั้นหนึ่ง อนิจจานี่เป็นไปไม่ได้กับ Java 7 หรือเก่ากว่า (การใช้งานเหมือนกันกับโรงงานถูกทิ้งไว้เป็นแบบฝึกหัดให้ผู้อ่าน)

ดังนั้นทางเลือกไม่มาก "ใช้รูปแบบที่แตกต่างกัน" แต่ "ใช้ภาษาที่มีโมเดลวัตถุที่ดีกว่า" หรือ "ไม่ทำปัญหาง่าย ๆ ให้วิศวกรทำมากเกินไป"


2
สิ่งนี้ไม่แม้แต่จะพยายามตอบคำถามที่ถามว่า: "อะไรคือทางเลือก"
ริ้น

1
อ่านที่ผ่านมาวรรคสองและคุณจะได้รับส่วน "ภาษาอื่น ๆ ทำอย่างไร" (PS: คำตอบอื่น ๆ ยังไม่แสดงทางเลือก)
Cephalopod

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

3
"ในภาษาแบบไดนามิกจำนวนมาก" เป็นการเข้าใจผิดเล็กน้อยเนื่องจากสิ่งที่จำเป็นจริง ๆ คือภาษาที่มีฟังก์ชั่นชั้นหนึ่ง "ไดนามิก" เป็นมุมฉากกับสิ่งนี้
Andres F.

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