วัตถุ "ชั้นหนึ่ง" คืออะไร


192

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

แก้ไข เมื่อมีคนพูดว่า "ทุกอย่างเป็นวัตถุ" (เหมือนใน Python) จริง ๆ แล้วเขาหมายความว่า "ทุกอย่างเป็นชั้นหนึ่ง" หรือไม่?


1
เป็นไปได้ไหมที่จะย้ายคำถามนี้ไปยังโปรแกรมเมอร์ หรือมันจะไม่เหมาะสมที่นั่นด้วย? ฉันคิดว่าคำถามนี้ดี ไม่สามารถพูดได้ว่าฟอรัมใดที่เหมาะกับมันที่สุด
Shashank Sawant

16
โหวตให้เปิดใหม่อีกครั้ง ... น่าเศร้าที่ดูเหมือนว่ามันจะถูกปิดโดยคนที่ไม่ได้เขียนโปรแกรมมันชัดเจนในหัวข้อ: /
djechlin

คำตอบ:


177

กล่าวโดยย่อก็หมายความว่าไม่มีข้อ จำกัด ในการใช้งานของวัตถุ มันเหมือนกับวัตถุอื่น ๆ

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

ขึ้นอยู่กับภาษาซึ่งสามารถบ่งบอกถึง:

  • การแสดงออกเป็นค่าตามตัวอักษรนิรนาม
  • สามารถจัดเก็บได้ในตัวแปร
  • สามารถจัดเก็บได้ในโครงสร้างข้อมูล
  • มีตัวตนที่แท้จริง (เป็นอิสระจากชื่อที่กำหนด)
  • เปรียบเทียบได้กับความเสมอภาคกับหน่วยงานอื่น
  • ผ่านได้เป็นพารามิเตอร์ในขั้นตอน / ฟังก์ชั่น
  • สามารถส่งคืนได้เนื่องจากผลลัพธ์ของขั้นตอน / ฟังก์ชัน
  • เป็น constructible ที่รันไทม์
  • พิมพ์ได้
  • สามารถอ่านได้
  • ถูกถ่ายทอดระหว่างกระบวนการกระจาย
  • สามารถจัดเก็บได้นอกกระบวนการทำงาน

แหล่ง

ในฟังก์ชั่น C ++ ตัวเองไม่ใช่วัตถุชั้นหนึ่งอย่างไรก็ตาม:

  • คุณสามารถแทนที่โอเปอเรเตอร์ '()' ทำให้สามารถมีฟังก์ชั่นวัตถุได้ซึ่งเป็นคลาสที่หนึ่ง
  • ตัวชี้ฟังก์ชั่นเป็นชั้นหนึ่ง
  • เพิ่มการผูกแลมบ์ดาและฟังก์ชั่นให้ฟังก์ชั่นชั้นหนึ่ง

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

นี่คือตัวอย่างของฟังก์ชั่นชั้นหนึ่งของ Javascript:

// f: function that takes a number and returns a number
// deltaX: small positive number
// returns a function that is an approximate derivative of f
function makeDerivative( f, deltaX )
{
    var deriv = function(x)
    { 
       return ( f(x + deltaX) - f(x) )/ deltaX;
    }
    return deriv;
}
var cos = makeDerivative( Math.sin, 0.000001);
// cos(0)     ~> 1
// cos(pi/2)  ~> 0

แหล่ง

หน่วยงานที่ไม่ใช่วัตถุชั้นหนึ่งเรียกว่าวัตถุชั้นสอง ฟังก์ชันใน C ++ เป็นคลาสที่สองเนื่องจากไม่สามารถสร้างแบบไดนามิกได้

เกี่ยวกับการแก้ไข:

แก้ไข เมื่อมีคนพูดว่า "ทุกอย่างเป็นวัตถุ" (เหมือนใน Python) จริง ๆ แล้วเขาหมายความว่า "ทุกอย่างเป็นชั้นหนึ่ง" หรือไม่?

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


2
คุณช่วยยกตัวอย่างของวัตถุที่ไม่ใช่ 'ชั้นหนึ่ง' ได้ไหม
Sudip Bhandari

1
@SudipBhandari ฉันสงสัยในสิ่งเดียวกันสุดท้ายก็พบบทความ Wikipedia ที่มีประโยชน์ในหัวข้อนี้: พลเมือง / วัตถุชั้นหนึ่ง ฉันพบคำจำกัดความของ Robin Popplestone เป็นประโยชน์อย่างยิ่ง (Btw, การโพสต์บทความ WP อาจดูเหมือนชัดเจนสุด ๆ แต่ฉันไม่ได้ตระหนักว่านี่เป็นแนวคิดการเขียนโปรแกรมภาษาพื้นฐาน)
24432

19

"เมื่อมีคนบอกว่า" ทุกอย่างเป็นวัตถุ "(เหมือนใน Python) จริงๆแล้วเขาหมายถึง" ทุกอย่างเป็นชั้นหนึ่ง "หรือไม่

ใช่.

ทุกอย่างใน Python เป็นวัตถุที่เหมาะสม แม้แต่สิ่งที่เป็น "ประเภทดั้งเดิม" ในภาษาอื่น

คุณพบว่าวัตถุเช่นนั้น 2แท้จริงมีส่วนต่อประสานที่ค่อนข้างสมบูรณ์และซับซ้อน

>>> dir(2)
['__abs__', '__add__', '__and__', '__class__', '__cmp__', '__coerce__', '__delattr__', '__div__', '__divmod__', '__doc__', '__float__', '__floordiv__', '__getattribute__', '__getnewargs__', '__hash__', '__hex__', '__index__', '__init__', '__int__', '__invert__', '__long__', '__lshift__', '__mod__', '__mul__', '__neg__', '__new__', '__nonzero__', '__oct__', '__or__', '__pos__', '__pow__', '__radd__', '__rand__', '__rdiv__', '__rdivmod__', '__reduce__', '__reduce_ex__', '__repr__', '__rfloordiv__', '__rlshift__', '__rmod__', '__rmul__', '__ror__', '__rpow__', '__rrshift__', '__rshift__', '__rsub__', '__rtruediv__', '__rxor__', '__setattr__', '__str__', '__sub__', '__truediv__', '__xor__']

เนื่องจากทุกอย่างเป็นวัตถุชั้นหนึ่งใน Python จึงมีกรณีพิเศษค่อนข้างคลุมเครือ

ตัวอย่างเช่นใน Java มีประเภทดั้งเดิม (int, bool, double, char) ที่ไม่ใช่วัตถุที่เหมาะสม นั่นเป็นเหตุผลที่ Java ต้องแนะนำ Integer, Boolean, Double และ Character เป็นประเภทเฟิร์สคลาส นี่อาจเป็นเรื่องยากที่จะสอนให้กับผู้เริ่มต้น - มันไม่ชัดเจนว่าทำไมทั้งประเภทดั้งเดิมและคลาสต้องอยู่เคียงข้างกัน

นอกจากนี้ยังหมายความว่าคลาสของวัตถุคือ - ตัวเอง - วัตถุ สิ่งนี้แตกต่างจาก C ++ โดยที่คลาสไม่ได้มีอยู่จริง ณ เวลาทำงาน

ประเภทของ2คือtype 'int'วัตถุซึ่งมีวิธีการคุณลักษณะและประเภท

>>> type(2)
<class 'int'>

ประเภทของประเภทในตัวชอบintเป็นtype 'type'วัตถุ นี้มีวิธีการและคุณสมบัติเช่นกัน

>>> type(type(2))
<class 'type'>

1
นี่เป็นความจริงของ Python ที่ทันสมัย ใน Python รุ่นเก่า (รุ่นที่ 1 เป็นเวลาก่อนหน้าของฉัน) คุณไม่สามารถรับช่วงintต่อได้ ดังนั้นคลาส "เก่า" และ "คลาสใหม่" (และใน 3 ไม่มีคลาสคลาสเก่าอีกต่อไป)
Keith Pinson

17

“ ชั้นหนึ่ง” หมายความว่าคุณสามารถใช้งานมันได้ตามปกติ ส่วนใหญ่แล้วนี่หมายความว่าคุณสามารถส่งผ่านพลเมืองชั้นหนึ่งเหล่านี้เป็นข้อโต้แย้งไปยังฟังก์ชั่นหรือคืนพวกเขาจากฟังก์ชั่น

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

void f(int n) { return n * 2; }

void g(Action<int> a, int n) { return a(n); }

// Now call g and pass f:

g(f, 10); // = 20

นี่คือตัวอย่างใน C # ที่ฟังก์ชั่นไม่ใช่วัตถุชั้นหนึ่ง รหัสด้านบนจึงใช้วิธีแก้ปัญหาเล็ก ๆ (คือตัวแทนทั่วไปที่เรียกว่าAction<>) เพื่อส่งผ่านฟังก์ชั่นเป็นอาร์กิวเมนต์ ภาษาอื่น ๆ เช่นทับทิมอนุญาตให้รักษาคลาสได้และบล็อคโค้ดเป็นตัวแปรปกติ (หรือในกรณีของ Ruby ค่าคงที่)


17

จากสไลด์ในโครงสร้างและการแปลความหมายของโปรแกรมคอมพิวเตอร์บรรยาย 2A (1986) ซึ่งจะเสนอราคาChristopher Stracey :

สิทธิและเอกสิทธิ์ของพลเมืองชั้นหนึ่ง:

  • ที่จะตั้งชื่อตามตัวแปร
  • จะถูกส่งผ่านเป็นข้อโต้แย้งไปยังขั้นตอน
  • ส่งคืนเป็นค่าของโพรซีเดอร์
  • เพื่อรวมเข้ากับโครงสร้างข้อมูล

1

IMO นี่เป็นหนึ่งในคำอุปมาอุปมัยที่ใช้อธิบายสิ่งต่าง ๆ ในภาษาธรรมชาติ คำที่ใช้เป็นหลักในบริบทของการอธิบายฟังก์ชั่นเป็นวัตถุชั้นหนึ่ง

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

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

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