Module và Class Module

Liên hệ QC

daibangkieuhanh

Thành viên chính thức
Tham gia
5/7/07
Bài viết
55
Được thích
21
Mình mới đăng kí làm thành viên của diễn dàn. Từ khi được trao đổi, học tập qua diễn đàn, mình thấy Excel càng hữu ích. Nhưng do hiểu biết về excel còn kém, chưa đóng góp được gì, chỉ hỏi, nên mong mọi người giúp đỡ nhiều.
Khi soạn thảo code trong VBA, mình không rõ chức năng của module và class module có gì khác, giống nhau. Trường hợp nào ta dùng module, còn trường hợp nào dùng class module.
xin giải thích hộ mình với. Cảm ơn nhiều.
 
Vấn đề này ai biết xin giải thích giúp. Mình cũng tìm hiểu qua nhiều người nhưng cũng không phân biệt được.
Xin cảm ơn !
TDN
 
Upvote 0
Đang định viết bài trả lời thì search thấy bài này của hai2hai đã trả lời 1 bài tương tự rồi.

Nếu các bạn làm quen với OOP (Object Oriented Programming) thì các bạn nên viết ứng dụng sử dụng "Module Class" vì viết thế vừa chuyên nghiệp, vừa mềm dẻo, vừa tốn ít bộ nhớ.

Thêm nữa, khi các đối tượng giao tiếp với nhau thì thường sử dụng Interface để giao tiếp. Các đối tượng trong lập trình cũng sử dụng các Interface Class để giao tiếp với nhau (eg: IEmployee, IGeneralLedger, IAcountPayable, v.v...).

Đừng trách mình lắm lời nói "lung tung" nhé. Mình sợ lắm rồi.
 
Lần chỉnh sửa cuối:
Upvote 0
Bác smbsolutions có thể cụ thể 1 ví dụ nhỏ về điều này không? Do chưa hình dung lắm.
Cám ơn bác nhiều.
 
Upvote 0
Giả sử bạn muốn nhập thông tin của đối tượng có tên là nhân viên, sau khi thiết kế này nọ thì bạn có 1 dạng thiết kế là DB Design với chi tiết về bảng thông tin như sau:

tb_Employee
ID Long - PK
Code Varchar(20) - Unique Index
FirstName Varchar(30)
MiddleName Varchar(50)
LastName Varchar(30)
DOB DateTime
...

Khi đó, bạn sẽ có 1 Object Class chuyên làm nhiệm vụ cập nhật thông tin của Employee vào CSDL (Mà người ta hay gọi là DB Layer Class). Object đó có tên là clsDAEmployee (DA= Data Access Layer)

....

thôi, tớ đi ăn cơm cái. Lúc nào có time viết tiếp...

À, mà bạn tìm hiểu về cách viết ActiveX DLL đi, nói thế này dài lắm. Nếu ngồi ở chỗ tớ. 15 phút xong tất những khái niệm cơ bản.

Thôi, các bạn chịu khó tự tìm hiểu đi. Tớ muốn sống thì phải đi ăn trưa chứ. 12:30PM ko đi ăn thì chết đói à. Tớ còn tỷ việc kia kìa.
 
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
smbsolutions đã viết:
Giả sử bạn muốn nhập thông tin của đối tượng có tên là nhân viên, sau khi thiết kế này nọ thì bạn có 1 dạng thiết kế là DB Design với chi tiết về bảng thông tin như sau:

tb_Employee
ID Long - PK
Code Varchar(20) - Unique Index
FirstName Varchar(30)
MiddleName Varchar(50)
LastName Varchar(30)
DOB DateTime
...

Khi đó, bạn sẽ có 1 Object Class chuyên làm nhiệm vụ cập nhật thông tin của Employee vào CSDL (Mà người ta hay gọi là DB Layer Class). Object đó có tên là clsDAEmployee (DA= Data Access Layer)

....

thôi, tớ đi ăn cơm cái. Lúc nào có time viết tiếp...

Nhờ bạn mở thêm 1 topic trên diễn đàn về cái khoản lập trình hướng đối tượng này được không ạ! Tụi tui mù về cái ni quá, cách tạo ra 1 class như thế nào, thế rồi ứng dụng của nó để làm cho Excel nhà ta phong phú ra sao, ... bọn tui nghe cứ như "Vịt nghe sấm".

Mong bạn nhiệt tình chứ cứ nhá... xèng...., chốc lại đi ăn cơm, lát lại kiếm cái time thì chán chết.

Cảm ơn smbsolutions

Mình mơ màng hiểu được chút ít rồi. Mong smbsolutions tiếp tục post thêm ít kiến thức về vấn đề này lên diễn đàn cho anh em được nhờ nhé.

Tôi chưa biết bác levanduyet là ai nhưng biết chắc chắn levanduyet là người có rất nhiều đóng góp lớn cho diễn đàn này. Các thành viên như chúng tôi rất biết ơn bác levanduyet đấy smbsolutions ạ!
 
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
Rất cảm ơn Anh Smbsolutions, giờ thì đã hiểu được phần nào. Khi nào tương đối rãnh rỗi, mong anh tranh thủ cho vài bài viết hoặc ví dụ cụ thể hơn để em và nhiều người đang rất muốn học tập.
Xin cảm ơn Anh.
 
Upvote 0
Bác levanduyet là bác nào mà sửa bài của mình thế nhỉ??? :) Mà tớ cũng chả nhớ trước đó viết gì nữa.

... tiếp nhé...
Thông thường khi làm việc với một đối tượng thì ra sẽ sử dụng các thuộc tính của đối tượng đó, các phương thức của đối tượng đó. Ví dụ: lớp Ô tô thì có những thuộc tính cơ bản là có 4 bánh, có vô lăng, có mui trần, có cửa kính, v.v...
Ô tô đó chạy được là phải có phương thức: Khởi động(), chạy(), v.v...
Ngoài ra, một số đối tượng còn có một số sự kiện (Evens) như các bạn hay làm với ActiveX.

Quay lại ví dụ class clsDAEmployee thì thông thường class này có những thuộc tính như là các trường trong table tb_Employee cũng như 1 vài thuộc tính phục vụ khác nữa.

Để cập nhật được vào CSDL thì thông thường lớp đối tượng đó phải kết nối (connect) vào CSDL, tức là có phương thức Connect(). Để thao tác với CSDL với các actions như CRUD (Create, Read, Update, Delete) thì trong lớp đó cũng có những Method tương tự (và thêm 1 vài methods nữa chứ ko chỉ có vậy).

Khi sử dụng đối tượng thì mình sử dụng như mọi người đã từng dùng.

eg:
Dim objDAEmployee AS clsDAEmployee
Set objDAEmployee = New clsDAEmployee

'// Delete Employee

objDAEmployee.ID = 1
If Not objDAEmployee.Delete() Then ....

if Not objDAEmployee Is Nothing Then Set objDAEmployee = Nothing

Đại khái là thế.

Đó mới chỉ là Data Access Layer. Ít khi chương trình sẽ gọi trực tiếp tới Data layer mà họ sẽ gọi qua lớp Interface và từ đó thông qua Business Layer để gọi tới Data Layer.

.....

Ôi, chả hiểu mình viết thế mọi người có đọc được ko. Ai đọc thấy vớ vẩn đừng trách tớ nhé. Bỏ qua đi. Thanks!

P/S: Ah, dĩ nhiên OOP thì ko chỉ đơn giản thế. Ngoài những thứ đó còn có vô số concepts như Abstract Class, Inheritance, Polymorphic, v.v.... nhưng có lẽ các bạn chả cần tìm hiều món đó đâu.

dvu58 đã viết:
Tôi chưa biết bác levanduyet là ai nhưng biết chắc chắn levanduyet là người có rất nhiều đóng góp lớn cho diễn đàn này. Các thành viên như chúng tôi rất biết ơn bác levanduyet đấy smbsolutions ạ!

À, thế chắc là cao thủ ẩn dật rồi. Vừa rồi tớ cũng đọc 1 số bài của bác levanduyet. Thế là tớ múa rìu qua mắt thợ rồi. :)

Ví dụ 1 DA Class, với tên Class là: CDTbMCountry (Hic, có mỗi cái class này là ngắn nhất thôi)

Mã:
Option Explicit
'*****************************************************************************
'* Use with MS SQL
'* Expects Table/View Based Data Object
'*
'*----------------------------------------------------------------------------
'*
'* Name:    CDTbMCountry.cls
'*
'* Purpose: Standard database access class for table 'tb_M_Country'.
'*
'*----------------------------------------------------------------------------
'* This Class was created by 
'* Modification Log:
'* ~~~~~~~~~~~~~~~~~
'* Date Created: 7/25/2003 11:58:27 AM
'* Modified by: smbSolutions
'*
'*****************************************************************************

Private Const MODULE_NAME = "CDTbMCountry"

Private m_nID As Long
Private m_sNameVN As String
Private m_sNameEN As String
Private m_sShortName As String

Private m_adoConn As ADODB.Connection    '// adoConn property.

Private mXMLFile As String    '// XMLFile property.

Private mClipString As String    '// ClipString property.

Public Property Let ClipString(ByVal vClipString As String)
  mClipString = vClipString
End Property

Public Property Get ClipString() As String
  ClipString = mClipString
End Property

Public Property Let XMLFile(ByVal vXMLFile As String)
  mXMLFile = vXMLFile
End Property

Public Property Get XMLFile() As String
  XMLFile = mXMLFile
End Property

Public Property Set adoConn(NewAdoConn As ADODB.Connection)
  Set m_adoConn = NewAdoConn
End Property

Public Property Get adoConn() As String
  adoConn = m_adoConn
End Property


Public Property Let ID(NewID As Long)
  m_nID = NewID
End Property

Public Property Get ID() As Long
  ID = m_nID
End Property
Public Property Let NameVN(NewNameVN As String)
  m_sNameVN = NewNameVN
End Property

Public Property Get NameVN() As String
  NameVN = m_sNameVN
End Property
Public Property Let NameEN(NewNameEN As String)
  m_sNameEN = NewNameEN
End Property

Public Property Get NameEN() As String
  NameEN = m_sNameEN
End Property
Public Property Let ShortName(NewShortName As String)
  m_sShortName = NewShortName
End Property

Public Property Get ShortName() As String
  ShortName = m_sShortName
End Property

Hết phần thuộc tính của class.
 
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
Tiếp theo là các phần method của Class.

Mã:
 Public Function Delete() As Boolean
 '******************************************************************************
 '*                                                                            *
 '* Name:    Delete                                                            *
 '*                                                                            *
 '* Purpose: Delete a record from the database.                                *
 '*                                                                            *
 '* Returns: True (success); False (otherwise).                                *
 '*                                                                            *
 '******************************************************************************
 On Error GoTo PROC_ERROR
 Dim strSQL As String
 Dim cCMD As ADODB.Command
 Dim lngRowsAffected As Long
         
   '// Assume function fails
   Delete = False
 
   '// SQL 'DELETE' string
   strSQL = "DELETE FROM tb_M_Country"
   strSQL = strSQL & " WHERE"
   strSQL = strSQL & " ID = " & m_nID
 
   Set cCMD = New ADODB.Command
 
   '// Execute SQL
   With cCMD
     .ActiveConnection = m_adoConn
     .CommandText = strSQL
     .CommandType = adCmdText
     .Execute lngRowsAffected
   End With
 
   '// All's well - return True
   Delete = True
 
 PROC_DONE:
   Exit Function
 
 PROC_ERROR:
   Call Process_Error(MODULE_NAME, "Delete")
   Resume PROC_DONE
 
 End Function
 
 Public Function Insert() As Boolean
 '******************************************************************************
 '*                                                                            *
 '* Name:    Insert                                                            *
 '*                                                                            *
 '* Purpose: Insert a new record to the database.                              *
 '*                                                                            *
 '* Returns: Boolean - True (record found); False (otherwise).                 *
 '*                                                                            *
 '******************************************************************************
 On Error GoTo PROC_ERROR
 Dim strSQL As String
 Dim cCMD As ADODB.Command
 Dim lngRowsAffected As Long
 Dim RS As ADODB.Recordset
 
   '// Assume function fails
   Insert = False
 
   '// SQL 'INSERT' string
   strSQL = "INSERT INTO tb_M_Country ("
   strSQL = strSQL & " ID,"
   strSQL = strSQL & " NameVN,"
   strSQL = strSQL & " NameEN,"
   strSQL = strSQL & " ShortName"
   strSQL = strSQL & ") VALUES ("
   strSQL = strSQL & " " & CheckInputNull(m_nID) & ","
   strSQL = strSQL & " " & CheckInputNull(m_sNameVN) & ","
   strSQL = strSQL & " " & CheckInputNull(m_sNameEN) & ","
   strSQL = strSQL & " " & CheckInputNull(m_sShortName)
   strSQL = strSQL & ")"
 
   Set cCMD = New ADODB.Command
 
   '// Execute SQL
   With cCMD
     .ActiveConnection = m_adoConn
     .CommandText = strSQL
     .CommandType = adCmdText
     .Execute lngRowsAffected
   End With
 
   '//strSQL = "SELECT SQ_tb_M_Country.CURRVAL FROM DUAL "  '// Oracle
   '//strSQL = "SELECT Max(ID) FROM tb_M_Country"  '// MS SQL
   '//Set RS = GetDataBySQL(strSQL)
   '//m_intNextID = RS.Fields(0).value
 
   '// All's well - return True
   Insert = True
 
 PROC_DONE:
   Exit Function
 
 PROC_ERROR:
   Call Process_Error(MODULE_NAME, "Insert")
   Resume PROC_DONE
 
 End Function
 
 Public Function Update() As Boolean
 '******************************************************************************
 '*                                                                            *
 '* Name:    Update                                                            *
 '*                                                                            *
 '* Purpose: Update a record in the database.                                  *
 '*                                                                            *
 '* Returns: True (sucess) ; False (otherwise).                                *
 '*                                                                            *
 '******************************************************************************
 On Error GoTo PROC_ERROR
 Dim strSQL As String
 Dim cCMD As ADODB.Command
 Dim lngRowsAffected As Long
 
   '// Assume function fails
   Update = False
 
   '// SQL 'UPDATE' string
   strSQL = "UPDATE tb_M_Country"
   strSQL = strSQL & " SET"
   strSQL = strSQL & " NameVN = " & CheckInputNull(m_sNameVN) & ","
   strSQL = strSQL & " NameEN = " & CheckInputNull(m_sNameEN) & ","
   strSQL = strSQL & " ShortName = " & CheckInputNull(m_sShortName)
   strSQL = strSQL & " WHERE"
   strSQL = strSQL & " ID = " & m_nID
 
   Set cCMD = New ADODB.Command
 
   '// Execute SQL
   With cCMD
     .ActiveConnection = m_adoConn
     .CommandText = strSQL
     .CommandType = adCmdText
     .Execute lngRowsAffected
   End With
 
   '// All's well - return True
   Update = True
 
 PROC_DONE:
   Exit Function
 
 PROC_ERROR:
   Call Process_Error(MODULE_NAME, "Update")
   Resume PROC_DONE
 
 End Function

Còn tiếp...
 
Upvote 0
Mã:
  Public Function GetData() As Boolean
 '******************************************************************************
 '*                                                                            *
 '* Name:    GetData                                                           *
 '*                                                                            *
 '* Purpose: Get the specified record. If found, return record details in      *
 '*          field properties. Properties are optional so procedure            *
 '*          will return only those attributes that are required.              *
 '*                                                                            *
 '* Returns: Boolean - True (record found); False (otherwise).                 *
 '*                                                                            *
 '******************************************************************************
 On Error GoTo PROC_ERROR
 Dim strSQL As String
 Dim rsGetData As ADODB.Recordset
 
 Const CST_FLD_ID = 0
 Const CST_FLD_NAMEVN = 1
 Const CST_FLD_NAMEEN = 2
 Const CST_FLD_SHORTNAME = 3
 
         
   '// Initialise recordset
   Set rsGetData = New ADODB.Recordset
         
   '// SQL 'SELECT' string
   '// Only select records that match the key passed in
   strSQL = "SELECT"
   strSQL = strSQL & " ID,"
   strSQL = strSQL & " NameVN,"
   strSQL = strSQL & " NameEN,"
   strSQL = strSQL & " ShortName"
   strSQL = strSQL & " FROM tb_M_Country"
   strSQL = strSQL & " WHERE "
   strSQL = strSQL & " ID = " & m_nID
 
   '// Ensure recordset uses an 'adClient' cursor
   rsGetData.CursorLocation = adUseClient
 
   '// Set active connection to recordset
   Set rsGetData.ActiveConnection = m_adoConn
 
   '// Open recordset
   rsGetData.Open strSQL, , adOpenForwardOnly, adLockReadOnly
 
   '// Map data to output field properties
   '//If rsGetData.RecordCount Then
   If Not rsGetData.BOF And Not rsGetData.EOF Then
     rsGetData.MoveFirst
     m_nID = CheckOutputNull(rsGetData(CST_FLD_ID))
     m_sNameVN = CheckOutputNull(rsGetData(CST_FLD_NAMEVN))
     m_sNameEN = CheckOutputNull(rsGetData(CST_FLD_NAMEEN))
     m_sShortName = CheckOutputNull(rsGetData(CST_FLD_SHORTNAME))
     GetData = True
   '// Record not found - return False
   Else
     GetData = False
   End If
 
   '// Detach cursor from database connection
   Set rsGetData.ActiveConnection = Nothing
 
   '// Cleanup
   If Not rsGetData Is Nothing Then
     If rsGetData.State = adStateOpen Then
       rsGetData.Close
     End If
     Set rsGetData = Nothing
   End If
 
 PROC_DONE:
   Exit Function
 
 PROC_ERROR:
   Call Process_Error(MODULE_NAME, "GetData")
   Resume PROC_DONE
 
 End Function
 
 Public Function GetAll(Optional ByVal vstrMyCriteria As Variant, _
                        Optional ByVal vstrMyOrder As Variant, _
                        Optional ByVal strXMLTitle As String = "") As ADODB.Recordset
 '******************************************************************************
 '*                                                                            *
 '* Name:    GetAll                                                            *
 '*                                                                            *
 '* Purpose: Get all records according to specified criteria.                  *
 '*                                                                            *
 '* Returns: A detached ADO recordset object containing the specified data.    *
 '*                                                                            *
 '******************************************************************************
 On Error GoTo PROC_ERROR
 Dim strSQL As String
 Dim rsGetAll As ADODB.Recordset
 
   '// Initialise recordset
   Set rsGetAll = New ADODB.Recordset
         
   '// SQL 'SELECT' string
   strSQL = "SELECT"
   strSQL = strSQL & " ID,"
   strSQL = strSQL & " NameVN,"
   strSQL = strSQL & " NameEN,"
   strSQL = strSQL & " ShortName"
   strSQL = strSQL & " FROM tb_M_Country"
 
   strSQL = strSQL & " WHERE "
 
   '// Criteria - use 'AND'
   If Not IsMissing(vstrMyCriteria) Then strSQL = strSQL & Space(1) & vstrMyCriteria
 
   '// Lose 'WHERE' clause and last 'AND' if not used
   strSQL = Trim(strSQL)
   If Right(strSQL, 5) = "WHERE" Then strSQL = Left(strSQL, Len(strSQL) - 5)
   If Right(strSQL, 3) = "AND" Then strSQL = Left(strSQL, Len(strSQL) - 3)
 
   If Not IsMissing(vstrMyOrder) Then strSQL = strSQL & " ORDER BY " & vstrMyOrder
 
   '// Lose 'ORDER BY' clause
   strSQL = Trim(strSQL)
   If Right(strSQL, 8) = "ORDER BY" Then strSQL = Left(strSQL, Len(strSQL) - 8)
 
   '// Ensure recordset uses an 'adClient' cursor
   rsGetAll.CursorLocation = adUseClient
 
   '// Set active connection to recordset
   Set rsGetAll.ActiveConnection = m_adoConn
 
   '// Open recordset
   rsGetAll.Open strSQL, , adOpenForwardOnly, adLockReadOnly
 
   '// Detach cursor from database connection
   Set rsGetAll.ActiveConnection = Nothing
 
   '// Return the recordset
   Set GetAll = rsGetAll
 
   '// Save to XML, ClipString
   If Len(strXMLTitle) <> 0 Then SaveRecordset rsGetAll, gstrXMLPath & strXMLTitle & ".XML", ClipString
 
   '// Cleanup
   Set rsGetAll = Nothing
 
 PROC_DONE:
   Exit Function
 
 PROC_ERROR:
   Call Process_Error(MODULE_NAME, "GetAll")
   Resume PROC_DONE
 
 End Function
 
 Public Function GetDataBySQL(pstrSql As String, Optional ByVal strXMLTitle As String = "") As ADODB.Recordset
 '******************************************************************************
 '*                                                                            *
 '* Name:    GetDataBySQL                                                      *
 '*                                                                            *
 '* Purpose: Get records according to free sql sting                           *
 '*                                                                            *
 '* Returns: A detached ADO recordset object containing the specified data.    *
 '*                                                                            *
 '******************************************************************************
 On Error GoTo PROC_ERROR
 Dim strSQL As String
 Dim rsGetDataBySQL As ADODB.Recordset
 
   '// Initialise recordset
   Set rsGetDataBySQL = New ADODB.Recordset
         
   '// SQL 'SELECT' string
   strSQL = pstrSql
 
   '// Ensure recordset uses an 'adClient' cursor
   rsGetDataBySQL.CursorLocation = adUseClient
 
   '// Set active connection to recordset
   Set rsGetDataBySQL.ActiveConnection = m_adoConn
 
   '// Open recordset
   rsGetDataBySQL.Open strSQL, , adOpenForwardOnly, adLockReadOnly
 
   '// Detach cursor from database connection
   Set rsGetDataBySQL.ActiveConnection = Nothing
 
   '// Return the recordset
   Set GetDataBySQL = rsGetDataBySQL
 
   '// Save to XML, ClipString
   If Len(strXMLTitle) <> 0 Then SaveRecordset rsGetDataBySQL, gstrXMLPath & strXMLTitle & ".XML", ClipString
 
   '// Cleanup
   Set rsGetDataBySQL = Nothing
 
 PROC_DONE:
   Exit Function
 
 PROC_ERROR:
   Call Process_Error(MODULE_NAME, "GetDataBySQL")
   Resume PROC_DONE
 
 End Function
 
 Public Function ExecuteByFreeSQL(ByVal strSQL As String) As Boolean
 '******************************************************************************
 '*                                                                            *
 '* Name:    ExecuteByFreeSQL                                                  *
 '*                                                                            *
 '* Purpose: Run free SQL statement.                                           *
 '*                                                                            *
 '* Returns: True (sucess) ; False (otherwise).                                *
 '*                                                                            *
 '******************************************************************************
 On Error GoTo PROC_ERROR
 
 Dim cCMD As ADODB.Command
 Dim lngRowsAffected As Long
 
   '// Assume function fails
   ExecuteByFreeSQL = False
 
   '// Check if SQL string is valid
   If Len(strSQL) = 0 Then GoTo PROC_DONE
 
   Set cCMD = New ADODB.Command
 
   '// Execute SQL
   With cCMD
     .ActiveConnection = m_adoConn
     .CommandText = strSQL
     .CommandType = adCmdText
     .Execute lngRowsAffected
   End With
 
   '// All's well - return True
   ExecuteByFreeSQL = True
 
 PROC_DONE:
   Exit Function
 
 PROC_ERROR:
   Call Process_Error(MODULE_NAME, "ExecuteByFreeSQL")
   Resume PROC_DONE
 
 End Function
 
 Private Sub Class_Initialize()
   
   Set m_adoConn = GetDBConnection
 End Sub
 
 Private Sub Class_Terminate()
   Set m_adoConn = Nothing
 End Sub
Đây là đoạn code hoàn toàn được generated bởi 1 công cụ mà trước kia hồi làm cùng công ty cũ với hai2hai tôi ... "chôm" được (không phải viết bằng tay một tý nào). Đùa tý, hồi đó bác đó khoe nên tớ xin ... mãi mới được.
 
Lần chỉnh sửa cuối:
Upvote 0
Cám ơn Anh Smbsolutions. Thật sự em cũng vẫn còn rất mơ hồ (thật sự cố gắng đọc codes của anh chỉ hiểu được chút xíu xiu thôi) Nhưng em sẽ cố gắng tìm hiểu để học tập thêm. Cám ơn Anh đã nhiệt tình và mong Anh tiếp tục post bài hướng dẫn.
 
Upvote 0
Cảm ơn nhiều, rất hay và bổ ích.
Mong tiếp tục.

P/S : lần sau các bác sửa bài của người khác nhớ để lại lý do nhé. Như thế là tôn trọng đấy.

smbsolutions đã viết:
Đây là đoạn code hoàn toàn được generated bởi 1 công cụ mà trước kia hồi làm cùng công ty cũ với hai2hai tôi ... "chôm" được (không phải viết bằng tay một tý nào). Đùa tý, hồi đó bác đó khoe nên tớ xin ... mãi mới được.

Mấy cái công cụ này mình thấy rồi. Mình có 1 ông anh làm ở FPT Soft, (trước đây đã được giải quốc tế về vật lý), ông có trình diễn cho mình mấy lần.
Khi viết code thấy lười quá, thế là ông ấy ngồi viết 1 tool (khoảng 15 phút), sau đó đó chỉ cần mô tả, thể là nó tự viết code cho, khi đó ông ấy đang làm 1 dự án gì đó cho Anh (gia công phần mềm).

Đại khái thế, vì cách đây 6 năm rồi, lúc đó mình mới chỉ biết đánh máy cho đúng tên mình là giỏi lắm rồi, huống chi lại nghe ông ấy nói về đối tượng, thuộc tính, module . . nghe như đàn gảy tai trâu.

Hay thật đấy.
 
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
TranNguyenDanNhi đã viết:
P/S : lần sau các bác sửa bài của người khác nhớ để lại lý do nhé. Như thế là tôn trọng đấy.
Chào bạn TranNguyenDanNhi,
Nếu bạn theo dõi sát thread này, bạn sẽ thấy tôi không hề sửa nội dung gì cả !

To:smbsolutions
Nếu bạn thật sự muốn hướng dẫn các bạn trong diễn đàn bạn nên trả lời một cách nhiệt tình, xin bạn đừng dùng "thôi, tớ đi ăn cơm" chẳng hạn. Làm cho các bạn khác "không vui" lắm...
Dvu58 đã viết:
Mong bạn nhiệt tình chứ cứ nhá... xèng...., chốc lại đi ăn cơm, lát lại kiếm cái time thì chán chết

Cám ơn bạn smbsolutions về loạt bài viết này.

Lê Văn Duyệt.
 
Upvote 0
smbsolutions đã viết:
Thôi, các bạn chịu khó tự tìm hiểu đi. Tớ muốn sống thì phải đi ăn trưa chứ. 12:30PM ko đi ăn thì chết đói à. Tớ còn tỷ việc kia kìa.
Muốn ăn trưa ai lại viết vô chổ trung tâm giải thích code này;Bạn hãy qua bên thư zản mà ăn trưa; Ở đó có nhiều món khá ngon & lại lạ nữa!
--=0 --=-- :=\+ __--__
 
Upvote 0
TranNguyenDanNhi đã viết:
Mấy cái công cụ này mình thấy rồi. Mình có 1 ông anh làm ở FPT Soft, (trước đây đã được giải quốc tế về vật lý), ông có trình diễn cho mình mấy lần.
Khi viết code thấy lười quá, thế là ông ấy ngồi viết 1 tool (khoảng 15 phút), sau đó đó chỉ cần mô tả, thể là nó tự viết code cho, khi đó ông ấy đang làm 1 dự án gì đó cho Anh (gia công phần mềm).

Đại khái thế, vì cách đây 6 năm rồi, lúc đó mình mới chỉ biết đánh máy cho đúng tên mình là giỏi lắm rồi, huống chi lại nghe ông ấy nói về đối tượng, thuộc tính, module . . nghe như đàn gảy tai trâu.

Hay thật đấy.

Bên đó (FSoft) tôi quen thế hệ trước nhiều lắm DanNhi à. Codegen thì có rất nhiều công cụ trên thế giới này. Hiện nay có rất nhiều công cụ Codegen cho .NET với những framework đã được chứng minh. Những cái đó như những "máy cái" trong môi trường sản xuất, vừa làm cho SP chuyên nghiệp lên, vừa làm giảm chi phí, tăng năng suất sản xuất.

levanduyet đã viết:
To:smbsolutions
Nếu bạn thật sự muốn hướng dẫn các bạn trong diễn đàn bạn nên trả lời một cách nhiệt tình, xin bạn đừng dùng "thôi, tớ đi ăn cơm" chẳng hạn. Làm cho các bạn khác "không vui" lắm...
Có lẽ bác ko rõ cách viết bài của tôi, của sanfrontier (tức quickquickslow), iso, sunf, vualua, ketoan@, v.v... trên webketoan (vì hầu hết những thành viên cứng trên GPE đều xuất phát từ box Excel bên đó nên chắc biết những người đó - tôi tham gia wkt từ hồi mới thành lập nhưng giờ cũng ko còn lên đó nữa do chất lượng bài viết ngày càng mai một). Một khi đang viết dở, phải dừng lại giữa chừng vì có việc gì đó thì phải để lại lý do, sau đó viết tiếp thì xóa bỏ lý do đó đi. Đó là cách viết bài rất tự nhiên, mang phong cách nói chuyện gần gũi, ko khô cứng.

Vì viết một bài tâm huyết cực tốn thời gian (nào là đúng văn phong viết bài, nào là không được sai chính tả, nào là phân đoạn cho dễ đọc, nào là sửa từ sao cho đúng,...). Mà tôi thường viết vào lúc tranh thủ trong khi làm việc (tôi làm 14h/24h/ngày).

Nhưng khi chưa viết xong thì tôi phải post tạm thời phần đang viết dở và phải đưa lý do tạm thời để người đọc hiểu là tôi sẽ còn post tiếp (để họ khỏi thắc mắc sao đang viết dở dang thì dừng lại). Khi nào viết tiếp vào bài đó tôi sẽ xóa phần giải thích đoạn lý do đó đi để cho liền mạch. Nếu các bạn để ý sẽ thấy hầu hết bài nào tôi cũng phải chỉnh sửa lại rất nhiều lần.

Đến giờ này, sau rất nhiều lần nghiên cứu về sự phù hợp với phong cách của diễn đàn, mặc dù đã có cố gắng viết tiếp khi đọc bài của Obak... nhưng có thể do khả năng kiến thức excel của tôi là rất hạn chế nên tôi cảm thấy mình rất mệt mỏi & buồn mỗi lần vào đọc những bài trả lời. Đặc biệt là sự ảnh hưởng rất nhiều tới sức khỏe và thời gian làm việc của tôi kể từ ngày bắt đầu tham gia post bài (vì tôi viết bài hay bỏ hết tâm sức vào từng câu từng chữ một).

Tôi khẳng định sẽ theo chân hai2hai để giữ gìn sức khỏe. (Mọi người thông cảm vì quả thật ko hiểu sao tôi rất mệt và thấy rất ảnh hưởng tới công việc hiện thời)

Chúc mọi người vui vẻ và học được nhiều kiến thức trên diễn đàn.
 
Lần chỉnh sửa cuối:
Upvote 0
Mình thấy cách viết của bác khá chuyên nghiệp và mặc dù rất bận nhưng bác vẫn cố gắng dành thời gian post bài trên diễn đàn này. Chân thành cảm ơn - Chúc bác luôn vui vẻ !
 
Upvote 0
smbsolutions đã viết:
Vì viết một bài tâm huyết cực tốn thời gian (nào là đúng văn phong viết bài, nào là không được sai chính tả, nào là phân đoạn cho dễ đọc, nào là sửa từ sao cho đúng,...). Mà tôi thường viết vào lúc tranh thủ trong khi làm việc (tôi làm 14h/24h/ngày).
Đồng ý với bạn. Qua các bài viết của bạn các thành viên khác cũng biết được khả năng của bạn.
Rất mong bạn tiếp tục chia sẻ kiến thức của mình với GPE.

Lê Văn Duyệt
 
Upvote 0
smbsolutions đã viết:
Bên đó (FSoft) tôi quen thế hệ trước nhiều lắm DanNhi à. Codegen thì có rất nhiều công cụ trên thế giới này. Hiện nay có rất nhiều công cụ Codegen cho .NET với những framework đã được chứng minh. Những cái đó như những "máy cái" trong môi trường sản xuất, vừa làm cho SP chuyên nghiệp lên, vừa làm giảm chi phí, tăng năng suất sản xuất.


Có lẽ bác ko rõ cách viết bài của tôi, của sanfrontier (tức quickquickslow), iso, sunf, vualua, ketoan@, v.v... trên webketoan (vì hầu hết những thành viên cứng trên GPE đều xuất phát từ box Excel bên đó nên chắc biết những người đó - tôi tham gia wkt từ hồi mới thành lập nhưng giờ cũng ko còn lên đó nữa do chất lượng bài viết ngày càng mai một). Một khi đang viết dở, phải dừng lại giữa chừng vì có việc gì đó thì phải để lại lý do, sau đó viết tiếp thì xóa bỏ lý do đó đi. Đó là cách viết bài rất tự nhiên, mang phong cách nói chuyện gần gũi, ko khô cứng.

Vì viết một bài tâm huyết cực tốn thời gian (nào là đúng văn phong viết bài, nào là không được sai chính tả, nào là phân đoạn cho dễ đọc, nào là sửa từ sao cho đúng,...). Mà tôi thường viết vào lúc tranh thủ trong khi làm việc (tôi làm 14h/24h/ngày).

Nhưng khi chưa viết xong thì tôi phải post tạm thời phần đang viết dở và phải đưa lý do tạm thời để người đọc hiểu là tôi sẽ còn post tiếp (để họ khỏi thắc mắc sao đang viết dở dang thì dừng lại). Khi nào viết tiếp vào bài đó tôi sẽ xóa phần giải thích đoạn lý do đó đi để cho liền mạch. Nếu các bạn để ý sẽ thấy hầu hết bài nào tôi cũng phải chỉnh sửa lại rất nhiều lần.

Đến giờ này, sau rất nhiều lần nghiên cứu về sự phù hợp với phong cách của diễn đàn, mặc dù đã có cố gắng viết tiếp khi đọc bài của Obak... nhưng có thể do khả năng kiến thức excel của tôi là rất hạn chế nên tôi cảm thấy mình rất mệt mỏi & buồn mỗi lần vào đọc những bài trả lời. Đặc biệt là sự ảnh hưởng rất nhiều tới sức khỏe và thời gian làm việc của tôi kể từ ngày bắt đầu tham gia post bài (vì tôi viết bài hay bỏ hết tâm sức vào từng câu từng chữ một).

Tôi khẳng định sẽ theo chân hai2hai để giữ gìn sức khỏe. (Mọi người thông cảm vì quả thật ko hiểu sao tôi rất mệt và thấy rất ảnh hưởng tới công việc hiện thời)

Chúc mọi người vui vẻ và học được nhiều kiến thức trên diễn đàn.

Mong rằng GPE vẫn còn những người có nhiệt tâm và trình độ như bác.

Trong một thế giới phẳng với thông tin đa chiều là một việc rất bình thường, hơn nữa đây chỉ là những thông tin một chiều (chỉ có điều đã bị phân lớp).

Mình rất mong bác luôn còn lý do để đem kiến thức giúp mọi người. Và mình luôn hoan hô điều này. Về lập trình thì mình mù tịt, nhưng ít ra về Xã hội thì cũng không đến nỗi là chú chuột chũi trong góc bếp

Hôm nào có dịp ra HN hoặc bác vào SG, mong sẽ được ngồi lai rai với bác bàn về Cổ Kim, về IT, về kinh doanh, về rượu, về thơ ca, về nhậu . . . .
ĐT: 0983.009157; email: hieu1563@gmail.com

Mong lắm thay.

Thân!
 
Upvote 0
levanduyet đã viết:
Chào bạn TranNguyenDanNhi,
Nếu bạn theo dõi sát thread này, bạn sẽ thấy tôi không hề sửa nội dung gì cả !

Lê Văn Duyệt.

Bác levanduyet là bác nào mà sửa bài của mình thế nhỉ??? :) Mà tớ cũng chả nhớ trước đó viết gì nữa.


thay đổi nội dung bởi: levanduyet, Hôm qua lúc 01:30 PM.

Thì mình thấy như thế nên mới viết vậy. Không phải thì . . . thôi vậy.
 
Upvote 0
Web KT

Bài viết mới nhất

Back
Top Bottom