อะไรคือข้อดีของ "วิธีการรวมกัน" ของ Getter / Setter VS แต่ละวิธี


12

นี่คือสิ่งที่ฉันเรียกวิธีการ "รวม" getter / setter (จาก jQuery):

var foo = $("<div>This is my HTML</div>"),
    myText;

myText = foo.text(); // myHTML now equals "This is my HTML" (Getter)
foo.text("This is a new value"); // The text now equals "This is a new value")

นี่คือตรรกะเดียวกันกับวิธีการแยก (ทางทฤษฎี):

var foo = $("<div>This is my HTML</div>"),
    myText;

myText = foo.getText(); // myHTML now equals "This is my HTML" (Getter)
foo.setText("This is a new value"); // The text now equals "This is a new value")

คำถามของฉัน:

เมื่อออกแบบห้องสมุดเช่น jQuery ทำไมคุณถึงตัดสินใจเลือกเส้นทางแรกไม่ใช่เส้นทางที่สอง? วิธีที่สองไม่ชัดเจนและเข้าใจง่ายกว่าไหม?


6
Martin Fowler ไม่ใช่แฟนของสิ่งที่เขาเรียกว่า " setter
vaughandroid

1
ฉันเคยชอบวิธีการแยก get / set (คิดว่ามันทำให้โค้ด "ชัดเจน" มากขึ้น) แต่ฉันพบว่ารูปแบบ getter / setter มากเกินไปน่าสนใจยิ่งขึ้นในทุกวันนี้ มันสามารถทำให้โค้ดสะอาดขึ้น ฉันไม่เคยพบว่าตัวเองชอบการประนีประนอมของนายฟาวเลอร์ ฉันคิดว่ามันเป็นสิ่งที่เลวร้ายที่สุดของทั้งสองโลก
Brian Knoblauch

การโต้เถียงที่แท้จริงเพียงอย่างเดียวของ Martin Fowler คือเมื่อ 'ทะเยอทะยาน' ผ่านไปในการโต้เถียงซึ่งในกรณีนี้มันทำให้ผู้อ่านสับสนว่ามันดูไม่เหมือนคนทะเลาะ ณ ตอนนี้ฉันได้ข้อสรุปว่าถ้าคุณยึดติดกับแบบแผนที่ผู้ทะเลาะกันไม่มีข้อโต้แย้งและ setter ใช้มันอย่างใดอย่างหนึ่งพร้อมกับความคิดเห็น API ที่ชัดเจนแนวทาง jQuery / Angular ควรจะใช้ได้ สำหรับตอนนี้.
zumalifeguard

คำตอบ:


13

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

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

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

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


2
ตกลงบวกฉันจะเพิ่มความปรารถนาที่จะลดขนาด JS ให้มากที่สุด
Matt S

-1 สำหรับคะแนนที่จำเป็น / verbose และ functional / implicit points

3
@ MattFenwick ฉันไม่ได้หมายถึงการรุกรานคุณกำลังบอกว่ามันไม่จริงหรือเปล่าที่กระบวนทัศน์การทำงานนั้นมีความเอนเอียงไปทางที่ซึ่งกระบวนทัศน์ที่จำเป็นนั้นมีความเอนเอียงไปทางจุดยืน? ฉันไม่ได้บอกว่าจะดีกว่าเพียงแค่คุณสามารถคุ้นเคยกับคนอื่นหรือคนอื่น ๆ ซึ่งจะทำให้คุณทำสิ่งต่าง ๆ โดยอัตโนมัติเมื่อเทียบกับคนอื่น (นี่จะเป็นแบบเดียวกัน)
จิมมี่ฮอฟฟา

@ จิมมี่ไม่มีปัญหา; ประเด็นของฉันคือจากประสบการณ์ของฉันฉันพบว่า implicitness / explicitness เป็น orthogonal ต่อ FP / สิ่งจำเป็น

@ MattFenwick อาจเป็นไปได้ แต่ฉันจะบอกว่านอกเหนือจากการอนุมานแบบที่อนุญาตให้มีนัยโดยนัยและเป็นเรื่องธรรมดาสำหรับระบบ HM ชนิดสิ่งอื่น ๆ ที่พบได้ทั่วไปในภาษา FP คือการโน้มน้าวทาง implicitness เช่นเดียวกับตัวดำเนินการทั้งหมด ฟังก์ชั่นไม่ได้มีชื่อที่ชัดเจนเพียงสัญลักษณ์ที่คุณคาดหวังที่จะเรียนรู้และรู้โดยปริยายหรือการใช้งานทั่วไปของรายการหรือสิ่งอันดับที่ต้องการความรู้โดยนัยเกี่ยวกับความหมายของสมาชิกและสถานที่แทน DUs (คิดว่า ฉันก็มักจะเห็นสามัญของชื่อพารามิเตอร์ตัวอักษรเดียว แต่คุณอาจจะถูกต้อง
จิมมี่ฮอฟฟา

2

แบบฟอร์ม

foo.text("This is a new value"); 

สามารถบ่งบอกถึงจำนวนของสิ่งต่าง ๆ มากที่สุดก็แสดงให้เห็นfooวัตถุด้วยวิธีการที่เรียกว่าtextยอมรับสตริงที่ทำอะไรบางอย่าง ไม่มีความหมายว่านี่เป็นทรัพย์สินทั้งหมด

ในหลายภาษาสิ่งนี้สามารถพิจารณารูปแบบย่อของ

var result = foo.text("This is a new value"); 

เมื่อผลลัพธ์ถูกทิ้ง ดังนั้นวิธีการนี้จะคลุมเครือเกินไปที่จะเป็นวิธีที่มีประสิทธิภาพในการตั้งค่าคุณสมบัติ (จากมุมมองการอ่านโค้ด)


นี่เป็นจุดที่ยอดเยี่ยม! ฉันใส่แว่นตา FP ของฉันเมื่อฉันอ่านจาวาสคริปต์และสิ่งต่าง ๆ ดูแตกต่างกันดังนั้นฉันจึงไม่ได้คิดถึงสิ่งนี้ แต่ถ้าฉันเห็นรหัสเช่นนี้ใน C # ฉันจะมีปฏิกิริยาที่คุณอ้างถึง "Wth ทำวิธีนี้หรือไม่ ??"
จิมมี่ฮอฟฟา

1

มันเป็นการเก็งกำไรเล็กน้อย แต่นี่คือช็อตของฉันที่มัน

jQuery โอบกอดธรรมชาติของจาวาสคริปต์อย่างเต็มที่ นั่นคือสิ่งที่ทำให้มันยอดเยี่ยมมาก แต่มันอาจทำให้นักพัฒนาหลายคนเกาหัวเมื่อพวกเขามาจากภาษา OO ที่ล้วนๆเช่น java ดูเหมือนจะทำลายการประชุมและการฝึกฝนที่ดีทั้งหมด

ฟังก์ชั่น langage มีแนวโน้มที่จะให้ความสำคัญกับไวยากรณ์ประกาศ มันมักจะอ่านคำแถลงความจริงมากกว่าคำสั่งชอบ ตัวอย่าง

var eligible = customers.where(c => c.age > 30);

ซึ่งสามารถอ่านได้ว่า "ลูกค้าที่มีสิทธิ์คือลูกค้าที่มีอายุมากกว่า 30" โดย constrast ภาษาที่จำเป็นอ่านเหมือนลำดับของคำสั่ง

for (customer in customers)
    if (customer.age > 30)
        eligible.add(customer)

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

การเพิ่ม aa setและการgetดำเนินการจะทำให้ jQuery รู้สึกเหมือนไลบรารี่ที่จำเป็น คุณสามารถ จำกัด วิธีการอ่านข้อความต่อไปนี้

// The element tag have an html of <p>hello</p>
$("#element").html("<p>hello</p>"); 

// content represent the html of the element tag
var content = $("#element").html();


//Imperative style

// Set the element tag to an inner html of <p>hello</p>
$("#element").setHtml("<p>hello</p>");

//Get the html of #element, and put it in the content variable
var content = $("#element").getHtml();

โดยการทำให้การกระทำกริยาจาก jQuery api พวกเขาทำให้มันรู้สึกเหมือน API ที่เปิดเผย มันให้ความรู้สึกสอดคล้องกับการใช้งานกับห้องสมุด นั่นคือเหตุผลที่ฉันคิดว่าพวกเขาใช้คำหลักมากเกินไป


1

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

หากคุณเคยดูคำจำกัดความของคลาสที่เต็มไปด้วยคุณสมบัติดังกล่าวคำนำหน้า "set" และ "get" จะดูฟุ่มเฟือยเนื่องจากการเพิ่มพารามิเตอร์ค่าจะบอกคุณว่ามันเป็น setter Martin Fowlerสร้างประเด็นที่ดีเกี่ยวกับตัวรับที่ต้องใช้พารามิเตอร์ แต่ถึงอย่างนั้นในบริบทนั้นพารามิเตอร์ค่าเพิ่มเติมจะแสดงถึงตัวตั้งค่าอย่างชัดเจนรวมทั้งข้อเท็จจริงที่ว่าตัวตั้งค่าไม่ค่อยปรากฏที่ด้านขวามือของการมอบหมาย และเมื่อคุณเขียนโค้ดคุณต้องดูเอกสารประกอบของห้องสมุดอยู่ดี

เมื่อคุณถามถึงข้อดีฉันจะไม่ครอบคลุมข้อเสีย

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