ชื่ออินเตอร์เฟสควรเริ่มต้นด้วยคำนำหน้า“ I” หรือไม่


73

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

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

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

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

ดังนั้นคำถามของฉันจึงลดลงไปถึง"ทำไมเราควรซ่อนความจริงที่ว่าบางส่วนของรหัสกำลังคาดว่าจะมีส่วนต่อประสาน"

แก้ไข

ในการตอบกลับคำตอบ:

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

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


3
ฉันเห็นด้วยกับประเด็นของคุณ มีประเด็นที่การซ่อนข้อมูลมากเกินไปไม่เป็นประโยชน์ อย่างไรก็ตามแม้ว่าคุณจะทำตามคำแนะนำนี้คุณจะยังสามารถบอกประเภทโดยใช้ IDE หรือ Add-on ได้
NoChance

3
คำถามนี้เป็นที่รู้จักกันดีว่าเป็นคำถาม "สัญกรณ์ฮังการี" คุณควรพบข้อโต้แย้งมากมายและเหตุผลที่นักพัฒนาที่ไม่ใช่ผู้พัฒนา MS ส่วนใหญ่ทิ้งคำถามนี้ไว้ใต้คำหลักนี้ สัญกรณ์ฮังการีส่วนใหญ่แพร่หลายสำหรับตัวแปร แต่โดยพื้นฐานแล้วมันก็เหมือนกันสำหรับประเภท
thiton

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

ตอบto know whether they will be implementing an interface or extending a class: ใช่ แต่ผู้ใช้ส่วนใหญ่ของรหัสของคุณจะเรียกมันว่าไม่ใช้มันหรือขยายมันและพวกเขาไม่สามารถดูแลได้อย่างแท้จริง
david.pfx

สำหรับสิ่งที่คุ้มค่าฉันชอบคำนำหน้า "ฉัน" อย่างหนาแน่น ฉันยังใช้คำนำหน้า "นามธรรม" ในคลาสนามธรรมด้วยเหตุผลเดียวกัน มันไม่ได้สร้างความแตกต่างให้กับผู้บริโภคของคลาส / อินเทอร์เฟซ แต่สามารถสร้างความแตกต่างใหญ่สำหรับผู้ที่ต้องการให้อินสแตนซ์ของมันและยังทำให้ง่ายขึ้นสำหรับนักพัฒนาอื่น ๆ ที่กำลังอ่านโค้ดของคุณ หมายความว่าพวกเขาสามารถมองเห็นสิ่งที่พวกเขากำลังทำอยู่โดยไม่ต้องปรึกษา IDE เป็นกรณี ๆ ไปสำหรับข้อมูลเพิ่มเติม ฉันเพิ่งเริ่มใช้ Angular และฉันพบว่ามันน่ารำคาญจริง ๆ ที่พวกเขาไม่ปฏิบัติตามอนุสัญญานี้!
Dan King

คำตอบ:


66

หากคุณหยุดคิดเกี่ยวกับสิ่งนี้คุณจะเห็นว่าอินเทอร์เฟซไม่แตกต่างจากคลาสนามธรรมจริง ๆ :

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

ในความเป็นจริงความแตกต่างที่สำคัญที่สุดระหว่างคลาสและส่วนต่อประสานคือ:

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

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

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

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

ทั้งหมดนี้ถูกกล่าวว่าฉันมักจะนำหน้าส่วนต่อประสาน C # ของฉันด้วยIเพราะนั่นคือ. NET แบบแผนที่ใช้และสนับสนุนโดย Microsoft และเมื่อฉันอธิบายข้อตกลงการเข้ารหัสให้กับนักพัฒนาใหม่มันไม่ยุ่งยากเพียงแค่ใช้กฎของ Microsoft มากกว่าที่จะอธิบายว่าทำไมเราจึงมีกฎ "พิเศษ" ของเราเอง


ขอบคุณสำหรับความล้มเหลวนี้ +1 สำหรับ "ความแตกต่างที่มีความหมายระหว่างคลาสและอินเทอร์เฟซ ... "
Charles Sprayberry

23
+1 สำหรับ "ทั้งหมดนี้ถูกกล่าวว่าฉันมักจะนำหน้าส่วนต่อประสาน C # ของฉันกับฉันต่อไปเพราะนั่นคือ. NET แบบแผนที่ใช้และสนับสนุนโดย Microsoft" นี่เป็นเหตุผลที่เพียงพอสำหรับฉันใน C # โดยทำตามมาตรฐานทั่วไปนี้มีโอกาสมากที่โปรแกรมเมอร์. NET อื่น ๆ ที่มีการระบุอินเตอร์เฟซ
Robotsushi

4
เป็นคนที่เขียนทั้ง Java และ C # คำสั่ง "ทั้งหมดนี้ถูกกล่าวว่าฉันมักจะนำหน้าอินเตอร์เฟส C # ของฉันกับฉันต่อไปเพราะนั่นคือการประชุม. NET ที่ใช้และสนับสนุนโดย Microsoft" ไม่สามารถอธิบายได้ - เป็นหนึ่งในสิ่งที่ ช่วยฉันจำภาษาที่ฉันใช้งานอยู่
Aidos

3
ความแตกต่างอีกอย่างหนึ่งใน. NET (แต่ไม่ใช่ใน Java) คือภาษา NET จำนวนมากไม่อนุญาตให้ส่วนต่อประสานมีวิธีการแบบคงที่ดังนั้นการแฮ็กIออกจากส่วนต่อประสานสามารถให้ชื่อที่ดีสำหรับชั้นเรียนEnumerable<T>.EmptyหรือComparer<T>.Default)
supercat

ฉันมีหนึ่งความกังวล ใน C ++ ถ้าคุณเปิดส่วนหัวและดูว่าclass Fooขยายออกไปแล้วclass Barจะไม่ชัดเจนในทันทีหากclass Barกำลังขยายหรือนำไปใช้ ดังนั้นตอนนี้คุณต้องไปดูที่class Barส่วนหัวเพื่อตัดสินใจว่าclass Fooจะขยายclass Bazหรือไม่ นอกจากนี้คำนำหน้า I ให้ภาพที่ชัดเจนว่า "คลาสฐานเดียว" ถูกละเมิดหรือไม่ - ดังนั้นคุณจะได้รับการตรวจสอบสติทุกครั้งที่คุณเปิดส่วนหัว
jsj

14

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


2
+1 เพื่อความสอดคล้อง> การประชุม ใน C # คุณจะใส่คำนำหน้าด้วย I และใน Java คุณจะไม่ทำ งานที่แตกต่างกันเรียกร้องให้มีการประชุมที่แตกต่างกัน
Bringer128

2
+1 ในขณะที่ฉันส่วนตัวไม่ต้องการที่จะมีอยู่ในอินเทอร์เฟซของฉันไม่สอดคล้องกับ BCL และห้องสมุดบุคคลที่สามที่ใช้ในโครงการ. Net ไม่ใช่ตัวเลือก imho
jk

13

หนังสือเล่มนี้เต็มไปด้วยสิ่งที่ดี แต่ฉันจะยังคงเพิ่ม "ฉัน" ไว้ในชื่อส่วนต่อประสาน

ลองนึกภาพคุณต้องมีการดำเนินการเริ่มต้นpublic interface ILogpublic class Log

ทีนี้ถ้าคุณตัดสินใจที่จะมีpublic interface Logทันใดนั้นคุณต้องเปลี่ยนชั้นเรียนเป็นpublic class LogDefaultหรืออะไรบางอย่างในบรรทัดเหล่านั้น คุณย้ายจากการมีตัวละครพิเศษหนึ่งตัวถึงเจ็ดตัว - แน่นอนว่ามันสิ้นเปลือง

มักจะมีเส้นแบ่งระหว่างทฤษฎีและการปฏิบัติ ในทางทฤษฎีนี่เป็นความคิดที่ดีจริงๆ แต่ในทางปฏิบัติมันไม่ดีนัก


สิ่งนี้ถูกกล่าวถึงในเอกสาร
levininja

30
"จินตนาการว่าคุณมีส่วนต่อประสานสาธารณะแบบสาธารณะกับ ILog โดยมีค่าเริ่มต้นเป็นบันทึกระดับการใช้งานสาธารณะ" - จากนั้นคุณมีชื่อที่ไม่ดีสำหรับการใช้งานเริ่มต้นของคุณ อะไรLogทำอย่างไร เข้าสู่คอนโซลหรือไม่ เพื่อ syslog? ไม่มีที่ไหนเลย? ผู้ที่ควรจะเรียกว่าConsoleLog, SyslogLogและNullLogตามลำดับ Logไม่ใช่ชื่อที่ดีสำหรับคลาสที่เป็นรูปธรรมเนื่องจากไม่ใช่ชื่อที่เป็นรูปธรรม
Sebastian Redl

7
โดยส่วนตัวนี่คือเหตุผลที่ฉันเกลียดที่จะเห็น ITheClassName คุณเพิ่งสร้างอินเทอร์เฟซโดยไม่มีเหตุผลหรือไม่มันเป็นเพียงแค่จุดรบกวนบน TheClassName หากอินเทอร์เฟซของคุณมีจุดประสงค์คุณควรตั้งชื่อให้ดีกว่า ITheClassName
Richard Tingle

ชื่อของคลาสจะใช้เพียงครั้งเดียว (เพื่อยกตัวอย่าง) ชื่อของอินเตอร์เฟสจะถูกใช้ทุกที่ การเพิ่มตัวอักษรไปยังอินเทอร์เฟซเพื่อบันทึกตัวอักษรในชื่อคลาสคือเศรษฐศาสตร์เชิงเท็จ (ของตัวละคร)
sergut

@ ริชาร์ดเกิ้ล แต่ฉันคิดว่าการใช้งานทั่วไปมีเพียงเพื่อให้MyClassมีรูปแบบที่เยาะเย้ยใช่มั้ย? นั่นก็คือเรามักจะใช้อินเตอร์เฟซเป็นหลักทำให้วิธีการสาธารณะจริงๆสาธารณะในแฟชั่นที่ช่วยให้การทดสอบ (ไม่ได้บอกว่าดีหรือไม่ดี แต่การเข้าใจว่าแรงจูงใจในการเชื่อมต่อนั้นมักจะเป็นเพียงแค่การสร้างคลาสที่พึ่งพาได้ง่าย ๆ ที่ล้อเลียนได้อธิบายการแมปแบบ 1 MyClassต่อ1 ถึงIMyClassการแมป)
ruffin

8

อย่างนี้ไม่เกี่ยวกับการใช้อินเทอร์เฟซหรือขยายคลาส ในกรณีที่คุณรู้ว่าสิ่งที่คุณกำลังทำ

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

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

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

โดยวิธีการอินเตอร์เฟซและชั้นเรียนเป็นประเภทการอ้างอิงในตอนท้าย และนี่คือสิ่งที่สำคัญ ดังนั้นนี่คือสิ่งที่แผนการตั้งชื่อของคุณต้องเน้น


@ แมท> ใช่นั่นเป็นข้อผิดพลาดของฉันและฉันแก้ไขมัน
deadalnix

5

คำตอบส่วนใหญ่ดูเหมือนจะสมมติว่าภาษาการเขียนโปรแกรมเป็นทั้ง Java หรือ C # ที่มีแนวคิด (หรือคำหลัก) สำหรับ interfaces / นามธรรมชั้นเรียน ในกรณีเหล่านี้ใน IDE ที่เหมาะสมจะสามารถมองเห็นได้ทันทีด้วยประเภทของข้อตกลงและการเขียนชั้นหนึ่งที่public interface IMyClassซ้ำกันโดยไม่จำเป็น มันเหมือนกับว่าคุณจะไม่เขียนpublic final FinalMyClass- ลองนึกถึงการใส่คำหลักทุกคำลงในชื่อคลาส

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

ดังนั้นคำตอบของฉันคือ: ขึ้นอยู่กับภาษาการเขียนโปรแกรม

อัปเดตในปี 2559:ประสบการณ์ C ++ 2 ปีต่อมาตอนนี้ฉันอาจจะคิดว่ามันเป็นการฝึกหัดที่ไม่ดีกับชื่อชั้นนำหน้าด้วยAbstractแม้ว่าฉันจะบอกว่าอาจมีรหัสฐานที่ซับซ้อนมากจนอาจสมเหตุสมผล


คุณแน่ใจหรือว่านี่เป็นคำตอบของคำถาม คุณอาจต้องการอ่านคำตอบอื่น ๆ และชี้แจงประเด็นของคุณ
david.pfx

C ++ มีอินเตอร์เฟซอย่างแน่นอนแม้ว่าจะไม่มีคำหลัก สิ่งที่คุณเรียกชั้นเรียนที่ฟังก์ชั่นสมาชิกทุกคนเป็นเสมือนบริสุทธิ์และไม่มีตัวแปรสมาชิก?

@ david.pfx: ฉันคิดว่าฉันตอบคำถามได้อย่างแม่นยำ "ชื่ออินเตอร์เฟสควรเริ่มต้นด้วยคำนำหน้า" I "หรือไม่": ขึ้นอยู่กับภาษาการเขียนโปรแกรม หากคุณคิดว่าการทำอย่างประณีตของฉันไม่ชัดเจนเพียงพอฉันยินดีที่จะปรับปรุงมัน - ส่วนไหนที่ไม่ชัดเจนสำหรับคุณ
Ela782

2
@ JohnGaughan: แน่นอนว่ามันมีอินเทอร์เฟซ! แต่จุดทั้งหมดของฉันก็คือว่ามันเป็นเรื่องเกี่ยวกับคำหลัก C ++ ไม่มีหนึ่งดังนั้นจึงไม่สามารถมองเห็น IDE / ผู้ใช้หากเขา / เธอเกี่ยวข้องกับอินเทอร์เฟซหรือไม่ อย่างไรก็ตามใน Java จะสามารถมองเห็นได้ทันที
Ela782

1
อ่านคำตอบที่ได้คะแนนสูงสุดและเปรียบเทียบของคุณ คุณยังใหม่กับ SO และนี่เป็นโอกาสที่จะเรียนรู้ว่าคำตอบประเภทใดที่ดึงดูดการลงคะแนน มันจะไม่เกิดขึ้น ด้วยการทำงานมากขึ้นคำอธิบายมากขึ้นคุ้มค่ามากขึ้นมันอาจจะ อยู่ที่นั่น!
david.pfx

4

ทำตามสำนวนภาษาที่คุณใช้

แต่ละภาษามีสำนวนและแนวทางการเข้ารหัสของตัวเอง ตัวอย่างเช่นใน C # มันเป็นสำนวนต่ออินเทอร์เฟซคำนำหน้าด้วย I. In Go ไม่ใช่


+1 ทำตามสำนวนภาษาที่คุณใช้ เห็นได้ชัดว่าผู้แต่งหนังสือเป็นผู้พัฒนา Java .NET / C #: ILog Java: บันทึก แต่ข้อเสีย: เมื่อฉันต้องการมีคลาส Log ที่ใช้อินเทอร์เฟซ ILog .... MyLog, LogDefault, LogBase, ... ? น่าเกลียดใช่ไหม น่าเกลียดกว่านี้คือ: LogImpl .... : D
hfrmobile

0

ในรหัส (Java) ของฉันฉันมักจะมีการประชุมนี้ใน APIs ที่ฉันเปิดเผยให้ผู้โทร:

  • ฟังก์ชั่นมีให้ผ่านอินเตอร์เฟสและไม่เคยเรียน
  • ส่วนที่ไม่ใช้งานได้เป็นคลาส

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

ในแง่ของการตั้งชื่อการประชุมอินเตอร์เฟซที่มีแนวโน้มที่จะ map ทั้งคำนามนักแสดง (เช่นFooBarWatcher) หรือคำคุณศัพท์ (เช่นFooBarWatchable) และทั้งสองเรียนข้อมูลบริสุทธิ์และ enumerations map คำนามไม่ได้ใช้งาน (เช่นFooBarStatus); IDE สามารถแนะนำผู้ใช้ API ได้โดยไม่ต้องมีการตั้งชื่อแบบพิเศษ ข้อยกเว้นตามแบบแผน Java ปกติ ( FooBarException, FooBarError, FooBarFault) ของหลักสูตร

ฉันมักจะใส่อินเทอร์เฟซไว้ในแพ็คเกจของตัวเองหรือแม้กระทั่งในห้องสมุดของตัวเองเพื่อให้แน่ใจว่าฉันจะไม่ทำผิดกฎของตัวเอง (สิ่งนี้ยังช่วยฉันจัดการการสร้างเมื่อฉันรับรหัสจากแหล่งภายนอกเช่นเอกสาร WSDL)


ฉันยังไม่เคยใส่Iคำนำหน้าบนอินเทอร์เฟซ ของแน่นอนมันเป็นอินเตอร์เฟซ! มันอยู่ใน API (หรือ SPI)!
Donal Fellows
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.