อะไรคือความแตกต่างระหว่าง 'เลเยอร์ของสิ่งที่เป็นนามธรรม' และ 'ระดับทางอ้อม'?


38

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

แก้ไข: ในเหตุผลที่ว่าทำไมผมพบคำทั้งสองอาจจะใช้แทนกันเป็นรายการเกี่ยวกับวิกิพีเดียชั้นที่เป็นนามธรรม คุณสามารถหาคำพูดของDavid Wheelers ที่ว่า 'ปัญหาทั้งหมดในวิทยาการคอมพิวเตอร์สามารถแก้ไขได้ด้วยการเปลี่ยนทิศทางในระดับอื่น'


7
... ยกเว้นปัญหาการอ้อมค้อมมากเกินไป!
Mason Wheeler

@MasonWheeler: คุณสามารถเพิ่มอีกระดับอ้อมน้อยร้าย ...
จอนจัง

C ++ ช่วยให้คุณสามารถเพิ่มเลเยอร์ของสิ่งที่เป็นนามธรรมโดยไม่มีเลเยอร์ของทางอ้อมดังนั้นพวกมันจึงไม่สามารถหมายถึงสิ่งเดียวกันได้
fredoverflow

คำตอบ:


30

ข้อเสนอที่เป็นนามธรรมด้วยความเรียบง่ายข้อตกลงทางอ้อมกับสถานที่

  • สิ่งที่เป็นนามธรรมเป็นกลไกที่ "ซ่อน" รายละเอียดที่ซับซ้อนของวัตถุในแง่ของความเรียบง่ายและง่ายต่อการจัดการเงื่อนไข ในการเขียนโปรแกรมตัวอย่างที่ดีคือความแตกต่างของรายละเอียดระหว่างรหัสเครื่องและเครื่องมือต่าง ๆ สำหรับการสร้างแอพพลิเคชั่นที่ตามรหัสเครื่องในที่สุด ลองสร้างแอปพลิเคชัน Windows Form ด้วย Visual Studio IDE IDE ช่วยให้คุณคิดถึงแอปพลิเคชันในแง่ของรายการที่จัดการได้ง่ายในลักษณะที่คุณเห็นว่าเป็นอะไรคุณจะได้รับ ตำแหน่งของวิดเจ็ตหน้าจอจะแยกออกเป็นตำแหน่งที่มองเห็นในกรอบซึ่งคุณสามารถเปลี่ยนได้โดยการลากวิดเจ็ตไปรอบ ๆ ภายใน IDE จะจัดการวิดเจ็ตโดยใช้เลเยอร์สิ่งที่เป็นนามธรรมเช่นภาษาระดับสูง (เช่น C #) C # ตัวเองไม่ได้รับการจัดการโดยใช้รหัสเครื่องมันถูกจัดการโดยใช้ "Common Runtime Environment"

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


2
+1 คำตอบที่ดีที่สุดจนถึงตอนนี้! กำลังจะเขียน แต่อันนี้อยู่ใกล้กับสิ่งที่ฉันมีในใจ
Newtopian

27

บทคัดย่อถูกนำมาใช้โดยใช้ทางอ้อม

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

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


2
ในความเป็นจริงตัวอย่างสุดท้ายไม่ดีมาก getters ธรรมดาและ setters จะเพิ่มสิ่งที่เป็นนามธรรม มีเพียงคนเดียวที่รู้ว่าพวกเขาเป็นธรรมดาคือชั้นเรียนประกาศพวกเขา หากคุณตัดสินใจที่จะเปลี่ยนการใช้งานโค้ดใด ๆ ที่สร้างขึ้นจากการลบจะไม่ได้รับผลกระทบ
back2dos

คุณสามารถยกตัวอย่างที่ดีกว่าซึ่งเป็นทางอ้อม แต่ไม่ใช่การทำลายล้างได้หรือไม่?
Mr Coder

1
เป็นตัวอย่างที่ผิดแน่นอน
Morg

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

2
ยกเว้นว่าตัวรับและตัวตั้งค่าไม่จำเป็นต้อง 'เข้าถึง' ตัวแปรเสมอไป หากคุณใช้ getter และ setter คุณกำลังเพิ่มสิ่งที่เป็นนามธรรมเนื่องจากคุณสามารถเปลี่ยนให้ใช้ตัวแปรที่แตกต่างกันโดยที่ผู้ใช้ไม่ได้ตระหนักถึงมันดังนั้นสิ่งที่เป็นนามธรรม
Dominique McDonnell

9

ก่อนอื่นให้ลองนิยามที่เหมาะสมสำหรับคำเหล่านี้:

  1. เลเยอร์ของสิ่งที่เป็นนามธรรมหมายถึง:

     a) there is large number of positions which use abstraction
          (layer = all the positions together)
     b) each position is hiding some complex stuff, but allows invoking it 
          using only simple code. 
         (abstraction == one-to-one mapping between simple code and complex code)
    
  2. ระดับของการอ้อมในทางตรงกันข้ามหมายความว่า:

      a) you're counting levels
      b) indirection==there are several steps before you can reach or access the data
      c) level of indirection is just how many steps it takes to access the data
    

ทั้งสองสิ่งนี้อาจหมายถึงสิ่งเดียวกันตราบใดที่คุณใช้:

  a) step = going from simple code to complex code. 

7

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


กับฟังก์ชั่นเสมือนจริงที่ถูกจำลองเป็นตัวชี้ไปยังฟังก์ชัน
Caleth

7

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

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

เลเยอร์ของนามธรรมคือการรวมของ abstractions และให้พวกเขามีความสมบูรณ์ของแนวคิดและความสอดคล้องของการใช้งาน CreateProcess เป็นชื่อ win32 API สำหรับกลุ่มของรหัสที่สร้างและดำเนินการตามกระบวนการ "ชื่อ" มีความสำคัญต่อบริบทนี้เพราะถ้าเราเรียกใช้ฟังก์ชันเช่น DoAllocMemThenMakeEnvThenFindEntryPoint ... จริง ๆ แล้วมันจะไม่เป็นนามธรรมมาก เลเยอร์เช่น Win32 API นั้นมีสิ่งกีดขวางซึ่งโปรแกรมเมอร์อาจไม่แนะนำให้ทำ มันขจัดความซับซ้อนจากมุมมองของผู้โทรด้วยค่าใช้จ่ายของพลังงานที่ลดลง (ความยืดหยุ่นประสิทธิภาพ ฯลฯ ) การแลกเปลี่ยนนี้ถูกเน้นโดยการอภิปรายบ่อยครั้งของ abstractions รั่ว: เราอาจยังต้องทำการเรียก SQL โดยตรงเมื่อใช้ Hibernate หรือทำการเรียก Win32 เมื่อใช้. NET

เกี่ยวกับทางอ้อมโปรแกรมที่ไม่น่าสนใจส่วนใหญ่ทำงานกับรูปแบบของรหัสผู้ใช้ทางอ้อมเป็นสักขีพยานในส่วน INPUT-OUTPUT ของ COBOL จากก่อนหีบ เมื่อเข้าถึงทรัพยากรเช่นฐานข้อมูลเราอาจเห็นการฝังสตริงการเชื่อมต่อ JDBC ในรหัสเป็นระดับ 0 ทางอ้อมการเชื่อมต่อ JNDI (ซึ่งมอบหมายทางเลือกของทรัพยากรให้กับคอนเทนเนอร์ของแอปพลิเคชัน) เป็นระดับ 1 และโครงสร้างสปริงบางรายการ แอปพลิเคชันตัวระบุ JNDI หนึ่งในหลาย ๆ คอนเทนเนอร์ทรัพยากรในระดับ 2 ระดับหลายระดับอนุญาตให้หลายฝ่ายภายนอกความสัมพันธ์ (ในกรณีนี้ความสัมพันธ์ระหว่างการเรียกใช้รหัสและฐานข้อมูล) เพื่อจัดการความสัมพันธ์นั้น สิ่งนี้ใช้ได้กับองค์ประกอบของโปรแกรมภายในเช่นอินเทอร์เฟซและเหตุการณ์

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


1

ตัวชี้ไปยังตัวชี้ไปยังตัวชี้ไปยังตัวชี้ไปยังตัวชี้ไปยังตัวชี้ไปยัง int มีหกระดับทางอ้อม แต่ไม่มีเลเยอร์ของนามธรรมสิ่งใด


0

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

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

สิ่งที่เป็นนามธรรมคือเมื่อคุณไม่จำเป็นต้องเข้าใจสิ่งที่ถูกซ่อนอยู่โดยที่คุณไปทางอ้อม


-1

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


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

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