กระทู้เก่าบอร์ด อ.Yeadram
1,556 8
URL.หัวข้อ /
URL
Property Get CurrentUserId()
ขอถามวิธีการใช้ Property Get หน่อยสิครับ
ผมอ่าน help ไม่ค่อยเข้าใจ
...
ผมอ่าน help ไม่ค่อยเข้าใจ
...
8 Reply in this Topic. Dispaly 1 pages and you are on page number 1
2 @R00861
แล้วมันต่างจากการ dim หรือ public อย่างไรไหมครับ
3 @R00862
มันคนละเรื่องนะครับ เพราะการสร้าง Property มีรูปแบบการเขียนคล้ายกับการเขียน Function ครับ เช่น
Public Property Get CurrentUserId( ) As String
Dim ...
...
CurrentUserId = ...
End Property
เปรียบเทียบกับ
Public Function CurrentUserId( ) As String
Dim ...
...
CurrentUserId = ...
End Function
ส่วนที่เราจะกำหนด Public หรือ Private หรือ Friend ก็แล้วแต่ว่าต้องการให้ Property นี้เห็นจากนอก Class นี้ด้วยหรือไม่ครับ
ส่วนการ Dim ตัวแปรนั้น ก็ยังใช้ได้ภายใน property procedure เหมือนกับใน function procedure หรือ sub procedure เช่นกันครับ
Public Property Get CurrentUserId( ) As String
Dim ...
...
CurrentUserId = ...
End Property
เปรียบเทียบกับ
Public Function CurrentUserId( ) As String
Dim ...
...
CurrentUserId = ...
End Function
ส่วนที่เราจะกำหนด Public หรือ Private หรือ Friend ก็แล้วแต่ว่าต้องการให้ Property นี้เห็นจากนอก Class นี้ด้วยหรือไม่ครับ
ส่วนการ Dim ตัวแปรนั้น ก็ยังใช้ได้ภายใน property procedure เหมือนกับใน function procedure หรือ sub procedure เช่นกันครับ
4 @R00863
ไม่เข้าใจครับ...
พอทราบว่าการเขียนไม่เหมือนกัน แต่ว่าการใช้งานมันเหมือนกันไหมครับ
มันคืนค่ามาค่อเดียวกันแล้วทำไมต้องใช้ get หละครับ
พอทราบว่าการเขียนไม่เหมือนกัน แต่ว่าการใช้งานมันเหมือนกันไหมครับ
มันคืนค่ามาค่อเดียวกันแล้วทำไมต้องใช้ get หละครับ
5 @R00865
ก่อนอื่นต้องเข้าใจก่อนว่า สิ่งที่คุณถาม มันเป็น syntax ในการเขียน procedure เพื่อสร้าง property ให้แก่ class มันเป็นเรื่องของ object oriented programming ครับ การจะสร้าง class ใน VBA ยังมีส่วนอื่นๆที่ต้องเขียนอีก ไม่ใช่แค่ statement แค่นี้ก็จะทำให้ใช้งานได้ อย่าเข้าใจผิดครับ คุณต้องไปอ่านส่วนอื่นๆ
ส่วนการใช้งานก็ตามที่ผมตอบไปแล้วว่า เราก็ต้องเรียกใช้ในรูปแบบ {Class Object}.{Property Name} ก็อย่างเช่น txtName.Value หรือ Form!fmMenu.Visible เป็นต้น ทั้ง .Value และ .Visible ก็เป็น Property นั่นเองครับ
ทีนี้มันเหมือนกับการเรียกใช้ Function ทั่วๆไปหรือไม่ ถ้าเรามองแค่ว่า มันก็แค่ให้ค่าอะไรสักค่ากลับมา มันก็เหมือนกับ Function แหล่ะครับ แต่นั่นเป็นการมองเพียงส่วนเดียวครับ การเขียนเป็น OOP นั้นยังมีประโยชน์อีกมากมายต่อวงจรการผลิตและดูแลรักษาซอฟท์แวร์ ยิ่งเป็นงานระดับกลางถึงใหญ่แล้ว สมควรที่จะใช้ OOP ครับ แต่ผมไม่เก่งเรื่องนี้ แค่สัมผัสเพียงผิวเผิน ก็จะไม่ขอพูดถึงแล้วกันว่ามันดีกว่าอย่างไร ลองค้นหาใน Google ดูนะครับ
ส่วนคำถามว่าทำไมต้องใช้ get .... ก็งงกับคำถามเหมือนกัน ขอตอบแบบกำปั้นทุบดินแล้วกันครับว่ามันเป็น syntax ของมันครับ ยกเว้นคุณจะใช้ Property Let หรือ Property Set ซึ่งก็ทำงานอย่างอื่นต่างจาก Propert Get ครับ
ส่วนการใช้งานก็ตามที่ผมตอบไปแล้วว่า เราก็ต้องเรียกใช้ในรูปแบบ {Class Object}.{Property Name} ก็อย่างเช่น txtName.Value หรือ Form!fmMenu.Visible เป็นต้น ทั้ง .Value และ .Visible ก็เป็น Property นั่นเองครับ
ทีนี้มันเหมือนกับการเรียกใช้ Function ทั่วๆไปหรือไม่ ถ้าเรามองแค่ว่า มันก็แค่ให้ค่าอะไรสักค่ากลับมา มันก็เหมือนกับ Function แหล่ะครับ แต่นั่นเป็นการมองเพียงส่วนเดียวครับ การเขียนเป็น OOP นั้นยังมีประโยชน์อีกมากมายต่อวงจรการผลิตและดูแลรักษาซอฟท์แวร์ ยิ่งเป็นงานระดับกลางถึงใหญ่แล้ว สมควรที่จะใช้ OOP ครับ แต่ผมไม่เก่งเรื่องนี้ แค่สัมผัสเพียงผิวเผิน ก็จะไม่ขอพูดถึงแล้วกันว่ามันดีกว่าอย่างไร ลองค้นหาใน Google ดูนะครับ
ส่วนคำถามว่าทำไมต้องใช้ get .... ก็งงกับคำถามเหมือนกัน ขอตอบแบบกำปั้นทุบดินแล้วกันครับว่ามันเป็น syntax ของมันครับ ยกเว้นคุณจะใช้ Property Let หรือ Property Set ซึ่งก็ทำงานอย่างอื่นต่างจาก Propert Get ครับ
6 @R00866
Type tUser
ID As String
Name As Variant
End Type
Dim typUser As tUser
Function RetriveUser
typUser.ID = "thannoy"
End Function
'=============================================
Property Get CurrentUserID()
CurrentUserID = typUser.ID
End Property
Function CurrentUserID
CurrentUserID = typUser.ID
End Function
คือจาก code ด้านบนที่ผมยังรู้สึกงงอยู่ว่ามันได้ผลรับเหมือนกัน
แต่ทำไมเราต้องเขียน code ให้ยุ่งยากด้วย ทำไมเราไม่
Public CurrentUserID as String
ให้มันจบไปเลยทีเดียวหละครับ
พอมีตัวอย่างที่มันใช้แตกต่างกันไหมครับ
ขอโทษที่รบกวนนะครับ
...จริงๆผมก็พอนำเอาไปใช้ได้ แต่ใช้แล้วไม่ค่อยเข้าใจรู้สึกว่ามันอย่างไงก็ไม่รู้
และผมก็เชื่อว่ามันน่าจะมีความแตกต่างกันเขาจึงทำออกมา
ID As String
Name As Variant
End Type
Dim typUser As tUser
Function RetriveUser
typUser.ID = "thannoy"
End Function
'=============================================
Property Get CurrentUserID()
CurrentUserID = typUser.ID
End Property
Function CurrentUserID
CurrentUserID = typUser.ID
End Function
คือจาก code ด้านบนที่ผมยังรู้สึกงงอยู่ว่ามันได้ผลรับเหมือนกัน
แต่ทำไมเราต้องเขียน code ให้ยุ่งยากด้วย ทำไมเราไม่
Public CurrentUserID as String
ให้มันจบไปเลยทีเดียวหละครับ
พอมีตัวอย่างที่มันใช้แตกต่างกันไหมครับ
ขอโทษที่รบกวนนะครับ
...จริงๆผมก็พอนำเอาไปใช้ได้ แต่ใช้แล้วไม่ค่อยเข้าใจรู้สึกว่ามันอย่างไงก็ไม่รู้
และผมก็เชื่อว่ามันน่าจะมีความแตกต่างกันเขาจึงทำออกมา
7 @R00868
เพราะ ตย.โค้ดที่ยกมาแสดงนั้น เป็นแค่การให้ค่าออกมา มันก็จะดูไม่ต่างจากการใช้ Function โดยทั่วไปหรอกครับ มันไม่ได้แสดงให้เห็นถึงความสามารถของ OOP อะไรเลย
หนึ่งในแนวคิดที่ทำให้เกิด OOP ก็คือต้องการป้องกันไม่ให้โค้ดส่วนอื่นๆมาแตะต้องตัวข้อมูลได้โดยตรง เหมือนอย่างที่เราทำ Public กันทั่วไปครับ เพราะในมุมมองนึงเราสามารถมองได้ว่า โปรแกรมก็ประกอบไปด้วย โค้ด และ ข้อมูล .. โปรแกรมมักจะต้องทำกับอะไรกับข้อมูล และผลของข้อมูลก็สามารถทำให้โปรแกรมทำงานแตกต่างกันไปได้ตามลอจิค เช่น IF DATA = 1 THEN ... เป็นต้น ปัญหาจะเกิดขึ้นเมื่อ โค้ดส่วนอื่นไปแตะต้องตัวแปร DATA โดยตรงเมื่อมันเป็น Public Variable แน่นอนว่าถ้าเราเป็นคนเขียนโค้ดเอง เราก็คงจะไม่ไปยุ่งโดยใช่เหตุ แต่ถ้าคุณเขียน Function เพื่อให้คนอื่นเรียกใช้ แล้วจะแน่ใจได้อย่างไรว่าไม่มีใครมือซนมาเปลี่ยนมันไป ... คนคิด OOP เขาก็คิดว่า ถ้างั้นหาวิธีไม่ให้คนอื่นมาแตะข้อมูลใดๆได้โดยตรง ถ้าจะทำ ต้องทำผ่านกระบวนการที่มีไว้ให้แล้ว ก็คือทำผ่าน Property ต่างๆของ Object นั้นๆครับ ซึ่งส่วนนี้ก็มีชื่อเรียกทางเทคนิคว่า Data Encapsulation และผลพลอยได้ก็คือไม่ต้องกังวลว่าจะมีชื่อตัวแปร public ซ้ำกับที่อื่นด้วยหรือไม่
ถ้าจะคิดว่า ถ้างั้นไม่ทำเป็น Public แต่กำหนดตัวแปรให้เห็นได้เฉพาะแค่ภายในในโมดูลที่เราเขียนขึ้นเท่านั้น แล้วสร้าง Function เพื่อกำหนดค่าให้แก่ตัวแปรนี้ ก็ไม่ต้องทำเป็น OOP จะได้ไหม .. คำตอบก็คือ ได้ครับ ซึ่งนั่นแสดงว่าคุณก็กำลังเลียนแบบแนวคิดการทำ Data Encapsulation อยู่นั่นเอง .. แต่ Data Encapsulation ก็เป็นแค่คุณสมบัตินึงในอีกหลายๆคุณสมบัติของ OOP ครับ
หวังว่าคงจะพอมองเห็นประโยชน์ของ OOP ได้บ้าง แต่เนื้อหาเต็มๆแล้ว ต้องไปอ่านต่อแล้วครับ
หมายเหตุ : VBA มีความสามารถของ OOP นิดหน่อยเท่านั้นครับ
หนึ่งในแนวคิดที่ทำให้เกิด OOP ก็คือต้องการป้องกันไม่ให้โค้ดส่วนอื่นๆมาแตะต้องตัวข้อมูลได้โดยตรง เหมือนอย่างที่เราทำ Public กันทั่วไปครับ เพราะในมุมมองนึงเราสามารถมองได้ว่า โปรแกรมก็ประกอบไปด้วย โค้ด และ ข้อมูล .. โปรแกรมมักจะต้องทำกับอะไรกับข้อมูล และผลของข้อมูลก็สามารถทำให้โปรแกรมทำงานแตกต่างกันไปได้ตามลอจิค เช่น IF DATA = 1 THEN ... เป็นต้น ปัญหาจะเกิดขึ้นเมื่อ โค้ดส่วนอื่นไปแตะต้องตัวแปร DATA โดยตรงเมื่อมันเป็น Public Variable แน่นอนว่าถ้าเราเป็นคนเขียนโค้ดเอง เราก็คงจะไม่ไปยุ่งโดยใช่เหตุ แต่ถ้าคุณเขียน Function เพื่อให้คนอื่นเรียกใช้ แล้วจะแน่ใจได้อย่างไรว่าไม่มีใครมือซนมาเปลี่ยนมันไป ... คนคิด OOP เขาก็คิดว่า ถ้างั้นหาวิธีไม่ให้คนอื่นมาแตะข้อมูลใดๆได้โดยตรง ถ้าจะทำ ต้องทำผ่านกระบวนการที่มีไว้ให้แล้ว ก็คือทำผ่าน Property ต่างๆของ Object นั้นๆครับ ซึ่งส่วนนี้ก็มีชื่อเรียกทางเทคนิคว่า Data Encapsulation และผลพลอยได้ก็คือไม่ต้องกังวลว่าจะมีชื่อตัวแปร public ซ้ำกับที่อื่นด้วยหรือไม่
ถ้าจะคิดว่า ถ้างั้นไม่ทำเป็น Public แต่กำหนดตัวแปรให้เห็นได้เฉพาะแค่ภายในในโมดูลที่เราเขียนขึ้นเท่านั้น แล้วสร้าง Function เพื่อกำหนดค่าให้แก่ตัวแปรนี้ ก็ไม่ต้องทำเป็น OOP จะได้ไหม .. คำตอบก็คือ ได้ครับ ซึ่งนั่นแสดงว่าคุณก็กำลังเลียนแบบแนวคิดการทำ Data Encapsulation อยู่นั่นเอง .. แต่ Data Encapsulation ก็เป็นแค่คุณสมบัตินึงในอีกหลายๆคุณสมบัติของ OOP ครับ
หวังว่าคงจะพอมองเห็นประโยชน์ของ OOP ได้บ้าง แต่เนื้อหาเต็มๆแล้ว ต้องไปอ่านต่อแล้วครับ
หมายเหตุ : VBA มีความสามารถของ OOP นิดหน่อยเท่านั้นครับ
8 @R00871
ขอบคุณครับ คุณสันติสุข
ต้องบอกตามตรงว่ายังคงไม่เข้าใจ แต่พอจะเห็นสิ่งที่เป็นความแตกต่างกันบ้างตามที่คุณ... ได้อธิบายไว้ หากมีตัวอย่างด้วยก็คงจะดี แต่ก็เอาหละมันออกจะยุ่งยากไปสักนิดนึง และคงอาจทำให้วุ่นวายพอสมควร
เอาเป็นว่าผมจะลองไปศึกษาเองดูก่อน ถ้ามีโอกาศจะกลับมาถามอีกครั้งนะครับ
ขอบคุณมากจริงๆครับ
ต้องบอกตามตรงว่ายังคงไม่เข้าใจ แต่พอจะเห็นสิ่งที่เป็นความแตกต่างกันบ้างตามที่คุณ... ได้อธิบายไว้ หากมีตัวอย่างด้วยก็คงจะดี แต่ก็เอาหละมันออกจะยุ่งยากไปสักนิดนึง และคงอาจทำให้วุ่นวายพอสมควร
เอาเป็นว่าผมจะลองไปศึกษาเองดูก่อน ถ้ามีโอกาศจะกลับมาถามอีกครั้งนะครับ
ขอบคุณมากจริงๆครับ
Time: 0.3008s
ถ้าไม่ได้สร้าง Class Module ก็จะเขียน syntax แบบนี้ไม่ได้ครับ