การรวมตัว getters และ setters


16

ไลบรารี JavaScript เช่น jQuery รวม 'getters' และ 'setters' ในอินเตอร์เฟสการเขียนโปรแกรมเช่น:

 $('element').css({'color','blue'});

จะตั้งค่าสีหรือ

 $('element').css();

จะได้รับ CSS สำหรับองค์ประกอบ

มีชื่อสำหรับรูปแบบดังกล่าวและเป็นวิธีปฏิบัติที่ดีที่จะใช้ในแอปพลิเคชันหรือไม่

คำตอบ:


12

Martin Fowler ได้ตั้งชื่อมันว่า Overloaded getter and setter ในบทความนี้ :

เมื่อไม่นานมานี้ฉันได้จิ้ม Javascript ไปแล้วสิ่งหนึ่งที่ทำให้ฉันหลงไหลคือนิสัยของการใช้ชื่อฟังก์ชั่นแบบเดียวกันกับ getter และ setter ดังนั้นถ้าคุณต้องการที่จะหาความสูงของแบนเนอร์ของคุณใน jQuery ที่คุณจะใช้และถ้าคุณต้องการที่จะเปลี่ยนความสูงที่คุณจะใช้$("#banner").height()$("#banner").height(100)

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

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


1
แม้ว่าโดยทั่วไปแล้วฉันจะเห็นด้วยกับสิ่งที่ฟาวเลอร์พูด แต่ฉันไม่เห็นด้วยกับสิ่งที่เขาไม่ชอบ เหตุผลของเขาคือ JavaScript ไม่ได้มีการจัดประชุมที่แข็งแกร่งเช่น Smalltalk ซึ่งทำให้สามารถใช้งานได้ที่นั่น อย่างไรก็ตาม jQuery มีระเบียบที่เข้มงวดและ JavaScript ไม่ใช่ jQuery jQuery เป็นเฟรมเวิร์ก
CaffGeek

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

2

มันเรียกว่า "method overloading" ในภาษา OO หรือ "function overloading" ในภาษาที่ไม่ใช่ OO

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

  • บริบทที่ใช้ค่อนข้างดีที่แยกหนึ่งจากที่อื่น
  • การเตรียมgetหรือsetชื่อวิธีเพิ่มความละเอียด
  • หากมีหลาย getters (เช่นหนึ่งสำหรับintหนึ่งสำหรับdouble) การเปลี่ยนประเภทใน LHS ของการมอบหมาย ( int x = foo.bar()vs. double x = foo.bar()) ไม่จำเป็นต้องมีการเปลี่ยนรหัส ( barAsInteger()vs. barAsDouble()) ทางด้านขวาหากชั้นเรียนมีทั้งสองอย่าง ข้อเสียของเรื่องนี้คือบางครั้งมันยากที่จะรู้ว่าวิธีการใดที่ถูกเรียกเพียงแค่ดูรหัส

มันยังเรียกว่า "ฟังก์ชั่นการบรรทุกเกินพิกัด" ใน C ++
DeadMG

ข้อกำหนดทั้งสองนี้ใช้กับ C ++ เนื่องจากมีทั้งวิธีและฟังก์ชั่นเปล่า ๆ
Blrfl

1

เนื่องจาก JavaScript ไม่มีคุณสมบัติจริง (โดยที่การตั้งค่าสามารถเรียกใช้โค้ดได้จริง) patter จึงเป็นคุณสมบัติที่ใช้สำนวนคุณสมบัติ (แม้ว่าคุณจะเรียกมันว่าอย่างอื่น)

ดังนั้นในภาษาที่ใช้คุณสมบัติจริงคุณควรทำเช่นนี้แทน:

element.css = ...
x = element.css

หากคุณต้องใช้รูปแบบ JavaScript ในภาษาที่จัดการคุณสมบัติคุณจะทำสิ่งผิดปกติ นั่นคงไม่ใช่ความคิดที่ดี จัดการกับคุณสมบัติที่ภาษานั้นใช้เพื่อจัดการดังนั้นคุณจะไม่สับสนคนอื่นที่ทำงานกับคุณ


"โดยที่การตั้งค่าสามารถเรียกใช้รหัสได้จริง" นี่ไม่จริงอีกต่อไป เป็นส่วนหนึ่งของข้อมูลจำเพาะตั้งแต่ ECMA 5
Demian Brecht

@Demian: แต่ JQuery ทำงานในเบราว์เซอร์ที่ไม่ใช้ ECMA 5
John Fisher

ฉันไม่ได้พูดถึงอะไรเกี่ยวกับความเข้ากันได้ข้ามเบราว์เซอร์เพียง แต่คำพูดนั้นไม่ถูกต้องตามที่เขียน
Demian Brecht

@Demian: ข้อความ "JavaScript ไม่มีคุณสมบัติจริง" ถูกต้องถ้าคุณคิดว่ามันใช้ JavaScript รุ่นที่มีอยู่ทั่วไป เนื่องจากเรากำลังพูดถึงในบริบทของการดำเนินการ JQuery คำสั่งจะถูกต้อง ขอบคุณที่ชี้ให้เห็นว่า JavaScript เวอร์ชันใหม่มีคุณสมบัติที่แท้จริง
John Fisher

0

ฉันคิดว่าคุณกำลังมองหา properties


นั่นคือชื่อของฟังก์ชั่นที่ให้ไว้ใน C # (และอาจเป็นภาษา. NET อื่น ๆ ?) ที่คล้ายกับสิ่งนี้ แต่มันก็ไม่เหมือนกันจริงๆ
โธมัสโอเวนส์

วิกิพีเดียตกลงว่า: en.wikipedia.org/wiki/Property_(programming)
thekip

ขอบคุณไม่ได้จริงๆคุณอาจจะมีการพูดกรณีที่คุณตั้งหรือได้รับเงินเดือนบุคคลในโปรแกรมประยุกต์person.salary('10000')หรือperson.salary()หรือคล้ายกัน
yannis

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

1
@yannis ไม่ถูกต้อง JavaScript มีไวยากรณ์สำหรับคุณสมบัติและไม่ใช่สิ่งที่คุณอธิบายไว้ในคำถามต้นฉบับเลย ดูen.wikipedia.org/wiki/Property_(programming)#JavaScriptสำหรับวิธีใช้และใช้คุณสมบัติใน JavaScript
โธมัสโอเวนส์

0

ฉันค่อนข้างต่อต้านโดยสิ้นเชิงด้วยเหตุผลง่ายๆ: คลาส, วิธีการหรือฟังก์ชั่นควรทำสิ่งหนึ่ง - ในความคิดของฉันและการรวมgetterและsetterวิธีการจะละเมิดกฎนั้น ดังผลลัพท์:

  1. returnค่าของฟังก์ชั่นแตกต่างกันไปขึ้นอยู่กับว่าทะเยอทะยานหรือหมาบล็อกได้รับการดำเนินการ หนึ่งนี้สามารถนำคุณไปสู่ฝันร้ายการบำรุงรักษา วิธีการของคุณควรจะกลับเพียงหนึ่งชนิดของข้อมูล / วัตถุในกรณีใด ๆ - หรือผลตอบแทนnull, falseหรือโยนexceptionในกรณีของข้อผิดพลาด
  2. การเขียนการทดสอบหน่วยจะยากขึ้นเนื่องจากฟังก์ชั่นนี้มีหน้าที่การใช้งานที่แตกต่างกันโดยสิ้นเชิง
  3. การเขียนเอกสารสำหรับวิธีการหรือฟังก์ชั่นนั้นยากกว่าด้วยเหตุผลที่ชัดเจน
  4. มันจะไม่สอดคล้องกันเมื่อจำเป็นต้องใช้วิธีการทะเยอทะยานหลายวิธี - ดังที่ได้กล่าวไว้แล้วในBlrflคำตอบ
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.