อาร์กิวเมนต์ของฟิลด์เทียบกับวิธีการ [ปิด]


9

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

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

ฉันต้องการฟังความคิดเห็นของคุณเกี่ยวกับสิ่งที่คุณคิดเกี่ยวกับการแลกเปลี่ยนนี้และวิธีการตัดสินใจเกี่ยวกับวิธีการที่จะใช้ในสถานการณ์ใด

เนื่องจากรหัสมักจะเข้าใจง่ายกว่าภาษาอังกฤษเมื่ออธิบายรหัสฉันจึงสร้างส่วนเล็กน้อยที่มีทั้งสองรูปแบบ: https://gist.github.com/JeroenDeDauw/6525656


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

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

คำตอบ:


2

เนื่องจากตัวอย่างของคุณมีวิธีการที่มองเห็นได้จากภายนอกupdateTableฉันคิดว่าการใช้ฟิลด์แทนพารามิเตอร์ของเมธอด

ถ้านี่เป็นส่วนหนึ่งของคลาสทั่วไป (เช่นTableTools) ฉันจะย้ายเมธอดตัวช่วยที่ต้องการให้รัฐเป็นคลาสภายในที่ซ่อนอยู่

ตัวอย่างรหัสเทียม:

class TableTools {
    ...
    public void updateTable(currentTable, newTable) {
        TableUpdater u = new TableUpdater(schemaModifier, currentTable, newTable);
        u.removeRemovedFields();
        u.addAddedFields();
     }

     private class TableUpdater { ... }
}

ด้วยวิธีนี้คุณหลีกเลี่ยงฟิลด์ที่ใช้โดยวิธีสาธารณะเดียวเท่านั้น นอกจากนี้โค้ดยังมีความปลอดภัยต่อเธรดในแง่ที่ว่าทุกการเรียกไปยัง updateTable จะใช้สำเนาของ TableUpdater และตัวแปรอินสแตนซ์ของ TableUpdater


7

การใช้เขตข้อมูลจะร่วมมือกับความสามารถในการมีหลายเธรดพร้อมใช้งานสำหรับวิธีการที่ใช้เขตข้อมูลเหล่านั้น

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


Multhithreading ไม่เกี่ยวข้องกับกรณีการใช้งานของฉันเพราะมันอยู่ใน PHP ฉันยอมรับว่าวิธีการนี้ไม่ดีหากวิธีการที่ใช้ฟิลด์นั้นไม่สำคัญ ในกรณีนี้พวกเขาจะเขียนถึง (และเขียนไปยัง) จากวิธีสาธารณะเท่านั้น ฉันไม่คาดหวังว่าสิ่งนี้จะทำให้เกิดปัญหา สำหรับเขตข้อมูลเช่นนี้จะดีขึ้นเล็กน้อยเท่านั้นจากนั้นฉันก็ไม่แน่ใจว่าคุณหมายถึงอะไร คุณสามารถทำอย่างละเอียด?
Jeroen De Dauw

7

ในคำพูดของคนธรรมดา:

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

อีกครั้งในความเห็นที่ต่ำต้อยของฉันวิธีการที่ไม่ยึดติดกันเป็นของคลาสยูทิลิตี้


1

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

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


0

ฉันคิดว่าการเลือกควรเป็นไปตามสถานการณ์จริงตามที่คุณเห็น หากรายการเป็นของอินสแตนซ์รายการนั้นควรถูกมองว่าเป็นฟิลด์ หากรายการนั้นอยู่นอกอินสแตนซ์รายการนั้นควรส่งผ่านเป็นพารามิเตอร์เมธอด

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


0

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

ถ้าคุณเขียนรหัสที่แพคเกจค่าดำเนินการที่จะดำเนินการในสิ่งที่คุณควรตัดสิ่งที่มันควรจะดำเนินการในวัตถุและผ่านไปยังสิ่งที่คุณว่าทำอะไรบางอย่าง

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

ดังนั้นคำถามของคุณแปลเป็นมันคือการ กระทำ หรือ ฟังก์ชั่น ? การดำเนินการอาจถูกเลื่อนออกไปหรือถูกยกเลิกและดังนั้นควร encapsulate ที่มันกระทำ ฟังก์ชั่นที่เกิดขึ้นทันทีดังนั้นจึงไม่มีความจำเป็นที่จะต้องรักษาด้านบนพารามิเตอร์

คุณสามารถยกเลิกและการดำเนินการแต่ไม่ได้เป็นฟังก์ชั่น

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