เราสามารถพูดได้ว่าวัตถุมีคุณสมบัติสถานะและพฤติกรรม?


16

ฉันอ่านคำแนะนำ OOP ของออราเคิลและฉันได้พบกับคำอธิบายนี้:

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

ปัญหาของฉันกับเนื้อเรื่องนั้นคือเมื่ออธิบายสถานะการผสมของคุณสมบัติมีเช่นกัน ตัวอย่างเช่นชื่อและสีของสุนัขเป็นคุณลักษณะของมันในขณะที่มันกำลังหิวหรือเป็นครั้งที่สามคือสถานะของมัน

ดังนั้นในความคิดของฉันมันถูกต้องมากขึ้นในการทำลายลักษณะของวัตถุที่เป็นสามส่วนแอตทริบิวต์ของรัฐและพฤติกรรม

แน่นอนว่าเมื่อแปลสิ่งนี้เป็นภาษาการเขียนโปรแกรมฉันสามารถเห็นได้ว่าพาร์ติชันแบบสามโฟลด์กลายเป็นแบบสองเท่าเนื่องจากทั้งแอ็ตทริบิวต์และสถานะจะถูกจัดเก็บลงในฟิลด์ / ตัวแปรในขณะที่พฤติกรรม

แต่การพูดในเชิงแนวคิดมันสมเหตุสมผลมากกว่าที่จะแยก 3 สิ่งออกจากกัน

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

หรือฉันคิดถึงอะไรบางอย่าง?


4
ใช่คุณขาดคุณสมบัติในการจำลองพฤติกรรม
yannis

ลองดูที่โพสต์นี้มันอาจช่วยได้: yegor256.com/2014/12/09/…
yegor256

คำตอบ:


13

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

คำจำกัดความสามส่วนนี้แสดงในภาษาการเขียนโปรแกรมตัวอย่างเช่นการใช้ finalคำหลักใน Java หรือreadonlyคำหลักใน C # เพื่อแสดงข้อมูลของอินสแตนซ์ซึ่งอาจไม่เปลี่ยนแปลงตลอดอายุการใช้งานของอินสแตนซ์

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


คิดว่ามันเป็นเงื่อนไขของการไม่เปลี่ยนแปลงและลักษณะการเปลี่ยนแปลงของอินสแตนซ์ทำให้รู้สึก และฉันดีใจที่ฉันไม่ไกล ขอบคุณ!
Daniel Scocco

ขนาดของหลอดไฟในระหว่างกระบวนการผลิตหรือประกอบจะเป็นสถานะหรือไม่?
JeffO

ไม่มันจะเป็นคุณสมบัติ (ในความหมายของคำว่า OP)
Mike Nakis

4
ไม่มีความแตกต่างพื้นฐานระหว่างสถานะและคุณลักษณะดังนั้นจึงง่ายกว่าที่จะกำหนดสถานะว่าอาจเปลี่ยนแปลงหรือเปลี่ยนแปลงไม่ได้ ในขณะที่มีแอตทริบิวต์ (ไม่เปลี่ยนรูป) และสถานะ (ไม่แน่นอน) ไม่ถูกต้อง (และมีความหมายเทียบเท่ากันมาก) ความแตกต่างนั้นทำให้คำนิยามมีความซับซ้อนมากกว่าที่จำเป็น แม้ว่า IMO คำว่า "state" อาจไม่ใช่คำที่ดีที่สุดในการอธิบายแนวคิดเนื่องจาก "สถานะ" อย่างใดก็หมายความว่ามันควรจะเปลี่ยนในขณะที่ "สถานะ" - ตามที่อธิบายไว้ในบทความของ Oracle - ไม่ได้มี
Lie Ryan

ฉันคิดว่าท่าทางของผู้คนที่มีต่อสิ่งที่ไม่สามารถเปลี่ยนแปลงได้นั้นเปลี่ยนไปเมื่อเวลาผ่านไป สำหรับผู้ที่เข้าใจความสำคัญของมันมีความแตกต่างพื้นฐานระหว่างรัฐที่ไม่แน่นอนและไม่เปลี่ยนรูปซึ่งเพียงพอที่จะรับประกันชื่อที่แตกต่างกัน ฉันขอแนะนำการอ่านที่น่าสนใจมากได้ไหม Eric Lippert - สุดยอดการผจญภัยในรหัส - การเปลี่ยนไม่ได้ใน C # ตอนที่หนึ่ง: ชนิดของการเปลี่ยนไม่ได้
Mike

4

ฉันคิดว่ามันแม่นยำกว่าที่จะบอกว่าวัตถุมีเพียงสองลักษณะเท่านั้น รับตัวอย่างของ Oracle:

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

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

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


ขนสีของสุนัขจิ้งจอกกลายเป็นรัฐหรือไม่เพราะมันเปลี่ยนไปในฤดูหนาว?
JeffO

@JeffO สีขนอาจเปลี่ยนไปเมื่ออายุมากขึ้นสีย้อมสกปรก ... ด้วยเหตุผลหลายประการ มันไม่ได้เป็นสถานะเพียงเพราะมันสามารถเปลี่ยนแปลงในช่วงชีวิตของวัตถุหนึ่ง แต่เนื่องจากวัตถุที่แตกต่างประเภทเดียวกันสามารถมีค่าที่แตกต่างกันสำหรับคุณลักษณะนั้น
Bill the Lizard

1

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


0

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

แนวคิด "หิว" และ "กระหายน้ำ" สามารถได้มาจากคุณสมบัติพื้นฐาน (เช่นระดับน้ำตาลในเลือดระดับความชุ่มชื้น) ดังนั้นเราจึงสามารถคิดว่าสถานะเป็นคุณสมบัติเมตาที่มาจากคุณลักษณะพื้นฐานที่เราสามารถเปลี่ยนเป็นจริงหรือเท็จตาม สถานะของแอตทริบิวต์ฐานที่เกี่ยวข้อง สำหรับตัวอย่างเช่นแสงเราสามารถคิดของแสงที่มีคุณลักษณะapplied_voltageและresistanceและฟังก์ชั่นและvoltage_switch() shine()voltage_swich()แล้วฟังก์ชั่นของการป้อนข้อมูลบางอย่าง (เช่นสวิทช์คู่มือแสงจับเวลา, ฯลฯ ) และshine()เป็นหน้าที่ของและapplied_voltage resistanceเราสามารถประกาศเมตาคุณลักษณะที่เรียกlight_stateว่าเป็นจริงหรือเท็จเพื่อช่วยสร้างวัตถุทางจิตใจ แต่ในที่สุดความคิดเหล่านี้ล้วนเป็นเพียงโครงสร้างทางจิตที่เราใช้เพื่อจัดระเบียบงานของเรา


-2

สถานะของวัตถุคือ เข้ารหัสในคุณลักษณะของมันไม่ว่าโดยตรงหรือโดยอ้อม ตัวอย่างเช่นหากคุณต้องการให้สุนัขของคุณกระหายน้ำคุณสามารถปล่อยให้มันมี

private boolean thirsty;

หรือคุณสามารถปล่อยให้มันเป็นแบบนี้ก็ได้

private Date lastDrinkAt;

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

ไม่ว่าจะด้วยวิธีใดสถานะของวัตถุของคุณจะอยู่ภายในแอตทริบิวต์

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

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


1
ออราเคิลได้กล่าวถึงสถานะอย่างชัดเจน; อ่านคำพูด และ OP เห็นได้ชัดว่าใช้คุณลักษณะคำในแง่ของลักษณะที่ไม่เปลี่ยนแปลงของวัตถุดังนั้นเขาจึงไม่สับสนกับสถานะ
Mike Nakis

พวกเขายังคงลักษณะ - ไม่ว่าจะมีการเปลี่ยนแปลงหรือไม่ว่าคุณจะเรียกพวกเขาว่า "คุณลักษณะ" หรือ "สมาชิก" ไม่มีอะไรในโลกของการเขียนโปรแกรมเพื่อแสดงสถานะของวัตถุนอกเหนือจากคุณสมบัติ
Raku

-3

การเชื่อมต่อโลกแห่งความจริงถูกเข้าใจผิด นี่คือวิธีที่ฉันจะสอน (วิธี c ++):

  1. คอมพิวเตอร์รองรับรูปแบบการจัดเก็บข้อมูลสองรูปแบบ: ข้อมูลและรหัส
  2. ข้อมูลดูเหมือนบิต 010101010101
  3. รหัสดูเหมือน asm คำแนะนำ
  4. บิตข้อมูลมีค่าที่แตกต่างกันสองค่าเป็น 0 หรือ 1
  5. ข้อมูลถูกแยกออกเป็นประเภทข้อมูล: int i = 1; เป็นเพียงสัญกรณ์สั้น ๆ สำหรับบางบิต 0000001
  6. โค้ดจะมีลักษณะเหมือนฟังก์ชัน: int f (int a) {return a + a + a; } เป็นสัญกรณ์สั้น ๆ สำหรับคำแนะนำ asm
  7. เมื่อคุณมีตัวแปรหลายตัวคุณรวมพวกมันเข้ากับ struct: int a; ลอยข; สามารถวางไว้ที่ struct AB {int a; ลอยข; };
  8. เมื่อคุณรวมรหัสบางส่วนเข้ากับมันคุณจะได้รับคลาส: class ABf {int a; ลอยข; ผลรวมลอยตัว (float c) const {return a + b + c; }};
  9. จากนั้นสำหรับข้อมูลเรามีชื่อตัวแปรซึ่งสามารถใช้เพื่อค้นหาค่า: a + b + c เพื่อเข้าถึงข้อมูล
  10. จากนั้นเรามีการเรียกใช้ฟังก์ชันปกติ: int k = f (10); เพื่อเข้าถึงคำแนะนำ asm "เก็บไว้" ภายใน f-function
  11. จากนั้นมีอินสแตนซ์ของวัตถุ: ABf var;
  12. และฟังก์ชั่นสมาชิกเรียก: int k2 = var.sum (10.0);
  13. ฟังก์ชั่นมีประเภท int f (int);
  14. ฟังก์ชั่นสมาชิกมีประเภท int ABf :: ผลรวม (ลอย);
  15. มีตัวชี้นี้พร้อมชนิด ABf *
  16. ตัวแปรเช่น a และ b และ c ขึ้นอยู่กับบริบทหากพวกมันอยู่ในฟังก์ชั่นสมาชิกพวกมันอาจหมายถึงสิ่งนี้ -> b หรือแค่ b
  17. ฟังก์ชั่นสมาชิก int ABf :: sum (float c) เป็นเพียงสัญกรณ์สั้น ๆ สำหรับผลรวม int (ABf * นี่, float c);
  18. คำว่า "state" หมายถึงเหมือนกับข้อมูล
  19. คำว่า "พฤติกรรม" นั้นหมายถึงเหมือนกับรหัส
  20. คำว่า "attribute" นั้นหมายถึงเหมือนกับข้อมูล

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

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