Monthly Archives: March 2012

Suy nghĩ về Dịch thuật

Suy nghĩ về Dịch thuật

Cao Xuân Hạo (Dịch giả, Nhà ngôn ngữ học)

Năm 2004 có mấy cuộc hôi nghị về dịch thuật tâp hợp những chuyên gia có uy tín trong ngành này, phần lớn đều lấy ba tiêu chuẩn TÍN, ĐẠT, NHà làm căn cứ để thảo luận, trao đổi. Hình như phần lớn đều chỉ băn khoăn về chữ NHà – một nỗi băn khoăn mà chúng tôi nghĩ là hoàn toàn chính đáng, vì chữ NHà hình như chỉ thích hợp với một văn phong nhất định, và khó lòng có thể nói rằng “phàm là một bản dịch thì nhất thiết phải có cái văn phong được gọi là “NHÔ. Nếu nguyên bản không “nhã”, mà lại gồ ghề thô lỗ, thì bản dịch “nhã” chắc chắn là sẽ không thực hiện được chữ “tín”, và sẽ nảy sinh một mâu thuẫn đối kháng ngay trong nội bộ của tiêu chuẩn được đề ra.

Nhưng như thế vẫn chưa hết. Ngay cả chữ ĐẠT cũng có một nội dung rất khó hiểu, khiến ta phải tìm xem những người lấy chữ ĐẠT làm tiêu chuẩn, họ hiểu chữ TÍN như thế nào. Nếu bản dịch hoàn toàn trung thành với nguyên bản (TÍN), nhưng lại rất dở, trong khi nguyên bản là một kiệt tác của văn học thế giới, thì lẽ nào có thể nói rằng đó là một bản dịch trung thành? Người đọc bình thường chắc hẳn phải nẩy ra cái ý nghi ngờ rằng người đặt ra tiêu chuẩn quan niệm chữ TÍN theo cái nghĩa là“sát từng chữ”. Nhưng bất cứ người nào đã học qua một ngoại ngữ, dù chỉ trong buổi học đầu tiên, cũng đã thấy ngay rằng dịch sát từng chữ là cách tốt nhất để dịch sai hoàn toàn [i] .

Dĩ nhiên mỗi người có thể có một hay nhiều bí quyết riêng để dịch cho đúng và cho hay theo thẩm năng của họ… Và quan trọng hơn nữa là mỗi người có thể tự cho mình những cái quyền riêng trong cách hiểu, đánh giá và xử lý một văn bản mà mình chọn. Chúng tôi có biết một dịch giả nổi tiếng, có mấy mươi bản dịch được xuất bản nhiều lần, đánh giá một nhà văn như Lev Tolstoy là “chưa biết viết văn” và tự ban cho mình cái quyền bỏ từng đoạn dài mấy chục trang của tác giả, đồng thời tự cho mình cái quyền không hiểu tác giả muốn nói gì trong hàng trăm trang khác!

Trong bài này chúng tôi muốn tự bó hẹp trong phạm vi phiên dịch (translation) hiểu theo nghĩa hẹp, gạt ra ngoài mọi công trình sáng tạo, dù vĩ đại đến đâu. Vì vậy trước hết chúng tôi cố tìm một cách định nghĩa có cơ may được nhiều người thừa nhận nhất. Đó là cách định nghĩa của M. Fyodorov (1950): “Dịch là chuyển đạt một văn bản từ một ngôn ngữ này (nguồn) sang một ngôn ngữ khác (đích) một cách trung thành trong chừng mực có thể, cả về nội dung lẫn về hình thức.” Vậy, xét về lý tưởng, sự thay đổi duy nhất mà người dịch có quyền thực hiện là ngôn ngữ, là thứ tiếng mà nguyên bản dùng để biểu đạt những ý nghĩa mà mình muốn biểu đạt, và nhiệm vụ của anh ta chính là dùng một thứ tiếng khác để truyền đạt tất cả những cái gì đã được truyển đạt bằng thứ tiếng kia.

Vậy “những cái đã được truyền đạt” mà người dịch có bổn phận truyền đạt lại một cách trung thành ấy (chữ TÍN, và chỉ một chữ TÍN mà thôi!), là những cái gì? Và người dịch phải có những cách thức nào, phải thực hiện những thao tác nào để làm tròn cái bổn phận ấy? Dĩ nhiên, trả lời câu hỏi này không đơn giản chút nào, vì ngôn ngữ là một thực thể hết sức đa diện, khó lòng có thể phân tích thành một số khía cạnh hữu hạn. Sau đây chúng tôi chỉ mong kể ra những bình diện cơ bản nhất của một văn bản thông thường có thể làm đối tương cho công việc phiên dịch.

1. Thể loại

Một văn bản, dù muốn dù không, cũng phải thuộc một thể loại nhất định, và “tính thể loại” chính là cái mà người dịch phải truyền đạt trước tiên. Tôi đã từng đọc một chồng bản dịch chuyện cổ tích trong đó người dịch truyền đạt những nguyên bản dài từ 2 đến 12 trang thành những thiên tiểu thuyết dài từ 200 đến 500 trang, và rất tự hào vì đã chuyển được những chuyện cổ tích sơ sài buồn tẻ thành những pho tiểu thuyết ly kỳ hấp dẫn đầy những chi tiết tinh vi và những đoạn đối thoại sắc sảo cho thấy một vốn hiểu biết sâu rộng về tâm lý người đời, mà vẫn giữ được y nguyên cốt chuyện của nguyên bản. Dịch giả từ biệt tôi với một nỗi tuyệt vọng khôn xiết không phải đối với mấy ngàn trang tiểu thuyết của mình, mà đối với sự kém cỏi của tôi, người đã không đủ sức hiểu cái giá trị tuyệt vời của cái công trình mà ông đã bỏ ra bấy nhiêu công sức để thực hiện. Ba mươi năm sau, khi chúng tôi gặp lại, vẫn chưa có một nhà xuất bản nào đủ sáng suốt để công bố bộ sách của ông. Ai cũng trả lời ấp úng một câu vô nghĩa: “Hay thì hay tuyệt, nhưng… nó thế nào ấy, không thích hợp lắm”. Tôi trộm nghĩ: cái không thích hợp ở đây chính là tính thể loại.

2. Chuyển thể

Tôi không hề phản đối việc chuyển thể – như đưa lên sân khấu (kịch nói, kịch thơ, tuồng, chèo, cải lương) hay màn ảnh, chuyển tiểu thuyết văn xuôi thành trường ca có vần điệu, chuyển truyện ngắn thành ngụ ngôn, chuyển chuyện cổ tích thành vè hay thành vũ kịch v.v., v.v. Có những tác phẩm được chuyển thể thành công, có tác phẩm được chuyển thể không thành công bằng. Tất cả đều lệ thuộc vào tài năng và công sức của người thực hiện việc chuyển thể. Dù sao thì nhìn chung, qua việc chuyển thể khó lòng tránh khỏi tình trạng mất mát một cái gì đó trong nguyên tác, tuy không phải không có những trường hợp lệ ngoại quý giá, trong đó kết quả của chuyển thể vượt hẳn nguyên tác về giá trị nghệ thuật. Những thí dụ về trường hợp này, có lẽ bất kỳ bạn đọc nào cũng có thể tìm ra một cách dễ dàng. Xin nhắc lại một lần nữa là chúng tôi đang nói đến dịch thuật hiểu theo nghĩa hẹp, cho nên không dám có tham vọng mở rộng phạm vi luận bàn sang những ngành lân cận.

3. Phóng tác

Rất gần gũi với chuyển thể công việc phóng tác, khi một người cầm bút thấy cần sửa đổi nguyên tác ít nhiều để cho tác phẩm thích hợp hơn với một đối tương nhất định, thường hẹp hơn cái đối tương mà tác giả hướng tới. Thường thường đó là đối tượng thiếu nhi. Làm việc này thường là một người lấy làm tiếc rằng một tác phẩm hay nào đó có phần không thích hợp với một công chúng lẽ ra có thể hiểu và thưởng thức nó nếu có ai căn cứ vào những đặc thù của lớp người mình đang muốn phục vụ mà cải biên lại chút ít, sao cho nó khớp với công chúng của mình. Nguyện vọng này hoàn toàn chính đáng, có thể thực hiện được và hơn nữa cũng rất cần thiết đối với những người còn phải chờ đợi một sự trưởng thành về trí tuệ mới có thể tiếp cận được một tác phẩm. Cũng xin nói rõ rằng công việc này chỉ có thể làm được với những tác phẩm văn học mà thôi, chứ đối với những tác phẩm nghệ thuật khác thì không ai nẩy ra cái ý phóng tác một bức tranh, một vở kịch câm hay một vũ kịch để cho nó thích hợp hơn với bất kỳ đối tượng nào. Vì một lẽ giản đơn: việc đó không thể nào làm được.

Còn như một loại tác phẩm quan trọng đối với mọi dân tộc như những bái hát ru con (thường là trích mượn từ những bài ca dao) thì công chúng chủ yếu của nó lại chính là “những người chưa đủ trưởng thành về trí tuệ”, nhưng lại không thể phóng tác được, phải hát đúng từng chữ khi ru con, với niềm hy vọng là nó sẽ được ghi lại trong ký ức thành những kỷ niệm không bao giờ phai mờ để sau này nhớ lại, con người trưởng thành sẽ coi nó như một truyền thống vĩnh hằng thiêng liêng nhất, quý giá nhất của dân tộc [ii] .

Sau khi đã nói rõ nội dung của những công việc có phần gần gũi với dịch thuật, khi bạn đọc đã có thể có được một khái niệm tương đối rõ ràng về những ranh giới khu biệt giữa dịch thuật với những công việc ấy, chúng tôi xin trình bày công việc dịch thuật như một quá trình gồm có mấy công đoạn tách biệt. Đó là một cách trình bày có tính ước định, chẳng qua để cụ thể hoá những chi tiết nhiều khi khó xác định của cái công việc không lấy gì làm đơn giản này

4. Những công đoạn của việc dịch thuật

Các tác giả của những giáo trình được đem giảng tại các khoa và bộ môn ngôn ngữ học mà chương trình có bao gồm nội dung Dịch thuật thường trình bày công việc của ngành khoa học này dưới dạng một quá trình có bốn công đoạn sau đây:

(1) Phân tích nguyên bản trong ngôn ngữ nguồn (Source Language) để “hiểu” thật rõ tác giả “muốn nói” gì.

(2) Xoá cách ngôn từ hoá của nguyên bản (Deverbalisation of the text)

(3) Phân tích những đặc trưng trong nội dung và hình thức của nguyên bản (qua một siêu ngôn ngữ ước định)

(4) Tái ngôn từ hoá bằng ngôn ngữ đích để có được một văn bản tương đương với nguyên bản (Reverbalisation in the Target Language so that the text obtained would be equivalent to that written in the Source Language).

Dĩ nhiên, cách phân ra thành công đoạn như trên không nhất thiết phải là một quá trình gồm những giai đoạn lần lượt kế tiếp nhau theo trật tự thời gian. Mỗi người dịch có thể làm việc theo một phương thức khác nhau, kê cả những phương thức hoàn toàn mặc ẩn (implicite), thậm chí vô thức (unconscious). Nhưng, cũng như khi nói về quá trình thụ đắc (acquisition) vốn tri thức của người bản ngữ về tiếng mẹ đẻ của mình, muốn dạy cách phiên dịch không thể có cách gì ngoài cách hiển ngôn hoá (explicitating), nghĩa là nói ra thành lời một cách tỏ tường để người học nhận thức được từng chi tiết, từng giai đoạn của quá trình thụ đắc vốn tri thức cần thiết. Ta hãy xét kỹ từng công đoạn trong quá trình làm việc của người phiên dịch có tri thức hiển ngôn về quá trình này.

(1), (2) Hiểu và phi ngôn từ hoá nguyên bản (xóa hết những từ ngữ của nguyên bản)

Câu hỏi tất nhiên phải nảy sinh trong tâm trí người đọc trước hết là: tại sao lại phải xóa những từ ngữ của nguyên bản, và sau khi làm như vậy, thì trong trí nhớ của người phiên dịch phỏng còn sót lại được những gì?

Người có kinh nghiệm và kỹ năng dịch thuật [iii] sẽ đáp:

– Không ai có thể nhớ hết từ ngữ trong một lời phát biểu ở hội nghị, nếu dịch miệng. Người dịch chỉ nhớ cái nghĩa của lời phát biểu. Người dịch viết có kinh nghiệm cũng biết rằng khi hiểu một câu văn, người dịch phải quên cách biểu đạt câu ấy bằng những từ ngữ gì. Sự quên lãng này sẽ càng ngày càng trở nên tự nhiên, thậm chí tự phát. Trong tâm trí người nghe (người đọc), những từ ngữ của nguyên bản lập tức bị quên đi để nhường chỗ cái ý mà tác giả muốn truyền đạt. Có thế người nghe (người đọc) mới hiểu được cái ý ấy.

– Vậy cái ý ấy cụ thể là cái gì, khi đã quên hết cách diễn đạt nó bằng những từ ngữ vốn làm thành cái bệ đỡ vật chất của nó?

– Cái ý ấy thường được giữ lại trong ý thức của người nghe (hay người đọc) dười dạng nhữnghình ảnh về những gì đã được thuật lại bằng lời. Những hình ảnh này có thể tĩnh (tư thế, dáng vẻ) hay động (động tác hay sự thay đổi tư thế, hình dáng). Ngoài ra, những hình ảnh này lại phải được đặt trên bối cảnh của những hình ảnh đã có trong văn cảnh trước đó, rồi lại được cắt nghĩa bằng những tri thức phổ thông (ngoài ngôn ngữ học) của người nghe hay người đọc.

Những người nghe dịch miệng trong hội nghị thường kinh ngạc trước cái trí nhớ “kỳ dị” của người phiên dịch chính là vì cứ tưởng anh ta nhớ hết các từ ngữ, trong khi thật ra anh ta chỉ nhớ cáinghĩa, cái ý mà người kia muốn nói ra thôi. Người dịch viết cũng không hề làm khác, nếu anh ta đã thực sự hiểu tác giả muốn nói gì. Ở đây chỉ cần lưu ý một chút nữa để thấy cần phân biệt mấy chữ muốn nói gì với những câu hỏi về nguyên do (tại sao mà nói thế?) về động cơ (nói thế để làm gì?).

Nói tóm lại, phi ngôn từ hoá nguyên bản không hề gây trở ngại cho người dịch mà chính là tạo một điều kiện không thể thiếu để họ có thể dùng nội quan (introspection) soi sáng tâm trí mình để thoát ra ngoài những từ ngữ có thể gây nên những tạp âm (noise – hiểu theo nghĩa của lý thuyết thông tin) có hại cho hoạt động “hiểu” (comprehension) của tâm trí nếu người nghe không quên ngay đi để chỉ tập trung vào việc hiểu cho đúng tác giả muốn nói gì, muốn mình hình dung được những hình ảnh nào.

(3) Công việc tìm hiểu cái nghĩa, cái ý mà tác giả muốn nói sẽ được nhận thức một cách minh xác hơn nữa khi ta phân tích một cách hiển ngôn, bằng siêu ngôn ngữ của ngôn ngữ học và của ngữ dụng học (nhất là trong những hành động ngôn từ (speech acts) của tác giả và của các nhân vật, trong đó có những câu được gọi là câu ngôn hành – performative sentences)

Những bình diện của lời nói và của văn bản đều được quan tâm phân tích đến mức chi ly, để không bỏ sót bất kỳ một chi tiết nào.

Tuy nhiên không nên nghĩ rằng hiểu một văn bản là một quá trình làm việc công phu đòi hỏi một thời gian dài. Công việc kiểm tra và phê bình, đánh giá mới đòi hỏi như vậy, còn việc người nghe (hay người dịch) hiểu cái nghĩa mà tác giả muốn truyền đạt bất chấp những lỗ hổng, những sự tỉnh lược, những chỗ không nói hết trong ngôn từ thường chỉ cần một khoảnh khắc, một nháy mắt cũng có thể được bù đắp ngay trong ý thức của người nghe (hay người dịch).

Sau đây là những nội dung ý nghĩa chứa đựng trong nguyên bản không bao giờ được truyền đạt bằng ngôn từ mà người nghe hay người dịch vẫn phục hồi được và hiểu ngay lập tức khi tiếp xúc với văn bản:

1. Tiền giả định (presupposition) . Khi gặp một người quen hỏi thăm mình bằng câu “Anh đã khoẻ chưa?”, người nghe (hay người dịch) biết ngay rằng người ấy có nghe ai đó nói rằng trước đó mình có bị bệnh. Nếu cái tiển giả định ấy đúng, anh ta có thể trả lời là ”Khoẻ rồi” hay “Chưa khoẻ”. Nhưng nếu cái tiền giả định ấy sai (tức trước đó anh ta không hề đau ốm gì), thì dù có trả lời thế nào cũng không ổn, vì cũng vô hình trung thừa nhận một tiền giả định hoàn toàn sai.

2. Hàm nghĩa từ vựng (lexical implication) . Khi một nhân vật trong nguyên bản nói “Nó sắp cưới vợ mới”, người nghe (và người dịch) biết ngay rằng nó là một người đàn ông trưởng thành từng có một đời vợ, mặc dầu trong câu không có một từ nào nói rõ giới tính của nó (nó dĩ nhiên có thể là một đứa con gái) và tình trạng hôn nhân trước đó của nó. Tuy vậy người nghe (và người dịch) suy diễn được ngay những điều này từ những từ khác có mặt trong câu như cưới vợ và mới.

3. Hàm ngôn hội thoại (conversational implicature) . Ta thấy có một hàm ngôn hội thoại khi người nghe (hay người dịch) có thể căn cứ vào một ý trong cuộc hội thoại mà suy ra một ý khác không nói ra nhưng vẫn có mặt trong ý thức người nghe (hay người dịch). Chẳng hạn khi nghe ai nói “Hôm nay nó không say”, người nghe hiểu ngay là có những hôm khác nó say.

Nói chung, ta thấy rằng một nguyên bản bất kỳ không nhất thiết phải nói hết nội dung của nó ra bằng từ ngữ, vì có những ý có thể được người nghe suy ra một cách dễ dàng ngay từ sự vắng mặt của những từ ngữ ấy.

Về những Đơn vị Ý nghĩa

Khi nghe một lời phát biểu ở hội nghị cũng như khi đọc một câu văn cần dịch, người nghe hay người đọc đang muốn dịch câu ấy thường bất giác chia câu ấy ra thành từng “cụm từ “ để lần lượt hiểu cho được những gì vừa nghe hay vừa đọc xong. Những “cụm từ” này không trùng với những đơn vị cấu trúc mà nhà ngôn ngữ học dùng những thủ pháp phân tích nghiêm ngặt để tách ra khỏi ngữ lưu (những ngữ đoạn, những từ đơn, những từ ghép, những thành ngữ, v.v.). Lederer gọi đó là những Đơn vị Ý nghĩa (Unités de sens).

Người nghe hay người dịch lần lượt hiểu và quên ngay những từ ngữ vừa nghe hay vừa đọc được không phải theo một kỹ năng khoa học, có cơ sở lý luận, mà theo bản năng, trong quá trình nghe hay đọc, hễ hiểu ra được khúc nào là ghi nhận ý nghĩa (và quên ngay từ ngữ) của khúc ấy.

Những đơn vị ý nghĩa này nối tiếp theo nhau (và có những chỗ chồng chéo lên nhau) trong tâm trí người nghe để cuối cùng làm thành cái ý nghĩa chung của câu văn và đoạn văn, rồi hội nhập vào những đơn vị rộng lớn hơn nữa,, những ý nghĩa mạch lạc hơn, và biến thành những kỷ niệm, những tri thức phi ngôn từ hoá trong tâm trí người nghe hay người dịch.

Kích thước của những đơn vị ý nghĩa có thể ở mỗi người một khác. Có người phải chờ cho hết một đoạn dài mới tổng kết được ý nghĩa của nó; có người chỉ cần nghe một hai chữ đầu đã hiểu cả đoạn.

(4) Tái ngôn từ hóa

Công đoạn cuối cùng của việc dịch thuật, – và cũng chính là mục đích tột cùng của nó – là việc tái ngôn từ hoá những gì người đọc đã hiểu được khi đọc nguyên bản, tức những ý và nghĩa mà tác giả muốn truyển đạt bằng cách sử dụng ngôn ngữ đích – thứ tiếng mà người dịch chọn làm phương tiện biểu đạt cho bản dịch của mình..

Như đã nói trên kia, một bản dịch xứng đáng với danh từ này phải có giá trị tương đương (equivalent) với nguyên bản về mọi phương diện, nội dung cũng như hình thức. Vậy muốn bản dịch có giá trị tương đương này, người dịch phải làm những gì?

Tính tương đương của một bản dịch so với nguyên bản có thể phân tích thành hai dình diện: bình diện nhận thức (équivalence cognitive) và bình diện xúc cảm (équivalence affective)

1. Tính tương đương về nhận thức

Tính tương đương trên bình diện nhận thức là kết quả của việc sử dụng những yếu tố phụ trợ về khái niệm mà người dịch đưa vào bản dịch để bổ sung cho ngữ nghĩa của nguyên bản. Việc bổ sung này là cho bản dịch khác với nguyên bản về hình thức. Mức độ khác nhau giữa nguyên bản và bản dịch tùy thuộc vào sự khác nhau về loại hình giữa ngôn ngữ nguồn và ngôn ngữ đích.

Cái khoảng cách này càng nhỏ thì càng có nhiều sự tương ứng (correspondences) về hình thức biểu đạt. Vì vậy giữa hai thứ tiếng cùng loại hình như tiếng Hán và tiếng Việt, đều là ngôn ngữ đơn lập (isolating) và phân tích tính (analytic) đến triệt để, đều không dùng đến hình thái học [iv], chỉ còn khác nhau ở trật tự từ ngữ trong ngữ danh từ (phụ trước chính sau), trong khi ngữ vị từ thì vẫn theo trật tự chính trước phụ sau, có thể tìm thấy khá nhiểu sự tương ứng về ngữ pháp và từ vựng trong cách biểu đạt. Huống chi trong tiếng Việt có đến từ 70% đến 80% từ ngữ gốc Hán, trong đó có những ngữ đoạn có cấu trúc chặt và thường có chức năng định danh, gọi là “từ Hán-Việt” [v] .

Còn giữa tiếng Việt và các thứ tiếng châu Âu, vốn thuộc loại hình khuất chiết hay biến hình (inflectional) và tính tổng hợp (synthetic) rất cao, cái khoảng cách ấy rất lớn, cho nên ít khi có thể tìm thấy những sự tương ứng, nhất là những sự tương ứng một đối một, giữa hai bên. Trong việc dịch thuật từ ngôn ngữ này sang ngôn ngữ kia, công đoạn phi ngôn từ hoá lại càng quan trọng và cần thiết. Khi đã hiểu được cái ý nghĩa mà tác giả muốn truyền đạt, thà xoá hết những từ ngữ của nguỵên bản tiếng Âu châu còn hơn mải loay hoay với những từ ngữ ấy mà sao lãng việc tìm cho ra cách biểu đạt cho thật đúng và thật hay những ý nghĩ và hình tượng mà tác giả muốn truyền đạt.

Tôi còn nhớ mãi một câu văn trong sách “kinh điển” do một nhà xuất bản lớn của Thủ đô ấn hành vào những năm 50 của thế kỷ vừa qua:

Cứ cái đà này, những con người rồi sẽ đến nước phải gặm cỏ nội như những con cừu cái.

Trong nguyên bản tiếng Pháp (xuất xứ của bản dịch vừa dẫn), ta thấy:

De ce train-là, les hommes en viendront à brouter l’herbe des prés comme les brebis.

Tôi hoàn toàn thông cảm với dịch giả trong sự nỗ lực dịch thật sát nguyên bản sách kinh điển, vốn được coi là một thứ thần văn mà nếu dịch sai dù chỉ một chữ hay một cái dấu chấm câu cũng có thể đề lại cho hậu thế nhũng hậu quả khôn lường. Nếu dịch giả không dịch như thế, thì ban biên tập chắc chắn sẽ sửa lại cho đúng như thế.

Nhưng đứng trên quan điểm của nghề dịch thuật, không thể không nói ra những nhận xét sau đây:

(a). dịch giả dịch sát những từ ngữ, chứ không truyền đạt cái ý mà tác giả muốn nói;

(b). dịch giả không biết tiếng Việt chuẩn khác tiếng Pháp như thế nào. Chẳng hạn, les hommeskhông tương ứng với những con người, mà với con người hay người ta; khi nói về động vật, tiếng Việt không có nhu cầu phải nói rõ số và giống như tiếng Pháp, cho nên viết ăn cỏ như cừu là đủ và đúng. Vả lại chẳng lẽ chỉ có cừu cái mời ăn cỏ, còn cừu đực thì không?

Dù câu dẫn trên đây có là một câu thần chú, trong đó mỗi chữ đều linh thiêng và có giá trị sinh tử đối với người khấn nguyện, thì cách dịch như thế vẫn là sai vì dùng ngôn ngữ đích không đúng chuẩn và do đó không tương đương với nguyên bản, ít nhất là về phương diện ngữ pháp và phong cách, vì có quá nhiều nét thừa dư (redundancies) nếu lấy nguyên bản tiếng Pháp làm chuẩn để so sánh.

Giáo sư phật học Minh Chi nhiêu lần than phiền rằng những bản dịch kinh Phật đọc lên không ai hiểu được chút gì, nhưng ông đã đề nghị dịch lại mấy lần mà Giáo hội không chịu, vì Kinh Phật “chỉ cần tụng niệm chứ không cần hiểu”.

2. Tính tương đương về xúc cảm

Không thể có một lý thuyết chung để xác định mức độ tương đương về tính xúc cảm giữa một bản dịch với nguyên bản, vì trên bình diện này sự khác nhau giữa các ngôn ngữ có thể nói là muôn hình vạn trạng. Mỗi ngôn ngữ có một cách riêng để kết hợp hai bình diện nhận thức và xúc cảm trong những thủ pháp thường gọi là tu từ học, hay phong cách học, hay hùng biện (rhetorics). Bình diện xúc cảm cũng có mặt trong cách dùng những thành ngữ, những tục ngữ, những lối nói mà truyền thống lâu đời của văn học dân gian đã nhuộm những màu sắc xúc cảm không mấy khi có thể phân tích và xác định bằng những thuật ngữ khoa học.

Tính tương đương về hai bình diện xúc cảm và nhận thức thường quyện vào nhau một cách hết sức nhuần nhuyễn trên khắc các cấp độ khác nhau của hệ tôn ti giữa các đơn vị ngôn ngữ.

Sau đây là cách trình bày của Werner Koller (1992) về những chuẩn tắc của tính tương đương trong dịch thuật:

* bản dịch phải chuyển đạt đủ những thông tin của nguyên bản về hiện thực ở bên ngoài ngôn ngữ (denotative Äquivalence)

* nó phải tôn trọng phong cách của nguyên bản: âm vực của ngôn ngữ, biệt ngữ xã hội và địa phương của nguyên bản (konnotative Äquivalence)

* nó phải phù hợp với thể loại chuẩn của nguyên bản (textnormative Äquivalence)

* nó phải được thích nghi với vốn tri thức của độc giả để cho độc giả hiểu được. Đó là một sự tương đương về dụng pháp (pragmatische Äquivalence)

* cuối cùng, bản dịch phải tạo ra được một hiệu quả thẩm mỹ tương đương với nguyên bản (formal-ästhetische Äquivalence).

Ta có thể tin chắc rằng những chuẩn tắc trên đây của W. Koller đề phải được tính đến, một cách có ý thức hay chỉ trong mẫn cảm trực giác, khi đánh giá một bản dịch. Tất nhiên, những chuẩn tắc này không phải là một phương pháp dịch thuật có thể dùng để soạn sách giáo khoa đào tạo những người phiên dịch. Nhưng nó có thể cho phép người ta kiểm nghiệm lại xem thử một bản dịch nào đấy có thiếu sót điểm nào trong việc đi tìm sự tương đồng hay không.

Ngay trong cách trình bày những chuấn tắc của mình về tính tương đồng của bản dịch so với nguyên bản, W. Koller không tránh khỏi việc so sánh giữa từ ngữ của bản dịch với từ ngữ của nguyên bản. Điều này có phần mâu thuẫn với nguyên lý chung của ngành dịch thuật: dịch không phải là thay thế những từ ngữ của nguyên bản bằng những từ ngữ của một thứ tiếng khác, mà hiểu lấy ý nghĩa của nguyên tác bằng cách xoá sạch từ ngữ của nó đi để tạo nên một ý nghĩa tương đương bằng những từ ngữ của một thứ tiếng khác.

Nhưng kiểm tra và đánh giá một bản dịch lại là một công việc khác.

*

Những dòng trên đây của chúng tôi không có tham vọng gì hơn là phác thảo một vài nguyên lý cơ bản của công việc dịch thuât xét về lý thuyết, chủ yếu dựa trên một cuốn sách tương đối mới (so với thuyết TÍN-ĐẠT-NHÃ của hai thế kỷ trước). Chúng tôi biết rằng bài này chưa đáp ứng được bao nhiêu những nhu cầu lý thuyết và thực tiễn của các bạn đồng nghiệp. Tôi chỉ mong sao những người có chú ý đến dịch thuật và có trách nhiệm trong ngành xuất bản quan tâm ít nhiều đến việc cho dịch và xuất bản một vài công trình có thể giúp cho những người làm việc trong ngành này có tài liệu để trau dồi tri thức về nghề nghiệp.

—-

[i] Trong số những chuyên gia nổi tiếng về phiên dịch có PGS. Phan Ngọc đã hàng trăm lần căn dặn các môn đệ rằng “muốn đổi gì thì đổi, chứ trât tự từ ngữ thì nhất thiết phải giữ y nguyên”.

[ii] Một điều đáng tiếc là những bài ca dao thường dùng khi ru con rất ít được học trong các giáo trình tiếng Việt, vì nó rất khác tiếng Tây, và do đó “chẳng có giá trị gì về ngữ pháp”.(ngay sách giáo khoa dạy tiếng cũng rât ít khi dẫn ca dao, vì câu ca dao tường cải chính một cách hùng hồn những quy tắc ngữ pháp tiếng Tây mà sách giáo khoa đem dạy cho người Việt).

[iii] Những tài liệu chủ yếu mà chúng tôi sử dụng trong bài này gồm có những đầu đề sau đây: Lederer M. La traduction aujourd’hui. Le modèle interprétatif. Hachette 1994; Seleskovich D.Traduire, de l’expérience au concept. Études de Linguistique Appliquée 24. Didier 1986. Sperber D. & Wilson D. Relevance, Communication and Cognition. Blackwell 1986. Sartre J. P. Qu’est-que la littérature. Gallimard 1985. Steiner G. After Babel.Aspects of Language and Translation. Oxford U.P. 1978; Delisle J. L’analyse du discours comme méthode de traduction. P.U.Ottawa 1984; Koller, W.Einführung in die Übersetzungwissenschaft. Heidelberg. 1992.

[iv] Đây là nói đến tiếng Hán”cổ điển” (thời Đường–Tống), vì tiếng Hán hiện đại đã có những yếu tố khá rõ của loại hình chắp dính (agglutinating languages) với sự xuất hiện hàng loạt của những phụ tố (affixes), do quá trình ngữ pháp hoá (grammaticalisation) của những “thực từ” vốn mang nghĩa từ vựng (lexical meaning) như danh từ (nouns) và vị từ (verbs), nay đã mất nghĩa từ vựng (“hư hoá”) mà chuyển thành những công cụ ngữ pháp (những phụ tố như tử, nhi, nhĩ, tố, đích, v,v,).

[v] Danh ngữ này, thường được coi như một vế đối lập với “từ thuần Việt”, đã gây nên nhiều sự ngộ nhận không đáng có.. Có nhiều người tưởng rằng “từ Hán-Việt” là những từ ngữ được ”vay mượn” từ nước ngoàiï rồi đem du nhập vào tiếng Việt, cũng giống như những từ ngữ tiếng Pháp, tiếng Anh hay Quảng Đông, Phúc Kiến, Nhật Bản, Hàn Quốc, đổng thời tưởng rằng từ ”thuần Việt” là những từ gốc Việt có từ thời khai thiên lập địa. Thật ra từ “thuần Việt” hầu hết là những từ gốc Thái, gốc Mường hay gốc Môn-Khmer. Trong khi đó thì từ Hán-Việt là một trong những cội nguồn quan trọng và cổ xưa nhất của tiếng Việt, nằm trong lớp hạ tằng của tiếng “thuần Việt”,chứ tuyệt nhên không phải là những từ mới vay mượn từ tiếng nước ngoài.

Tôn vinh Nhã nhạc tại Festival Huế 2012

Tại Festival Huế 2012, Nhã nhạc Huế tiếp tục được tôn vinh qua lễ hội “Ngự thuyền khám phá sông Hương” và “Đêm Hoàng Cung” nhằm đưa bộ môn nghệ thuật chỉ phục vụ trong cung vua xưa đến rộng rãi với công chúng. Các hoạt động của “Đêm Hoàng Cung” sẽ được bố trí trên 3 trục chính: trục giữa (từ Ngọ Môn đến nền điện Kiến Trung), trục trái (từ Thế Miếu đến cung Trường Sanh) và trục phải (từ phủ Nội Vụ đến vườn Cơ Hạ), với các trò chơi cung đình, chương trình Dạ nhạc tiệc cung đình, Đêm Phương Đông, và các vũ khúc cung đình…

Biểu diễn nhã nhạc tại Festival Huế
Biểu diễn nhã nhạc tại Festival Huế

Ông Phan Thanh Hải, Phó Giám đốc phụ trách Trung tâm Bảo tồn di tích Cố đô Huế cho biết: Từ năm 2003, khi Nhã nhạc cung đình Huế (Âm nhạc cung đình Việt Nam) được UNESCO tôn vinh là Di sản văn hoá phi vật thể và truyền khẩu của nhân loại đến nay, Trung tâm đã sưu tầm, bảo tồn và dàn dựng được hơn 30 nhạc chương trong các lễ tế, 40 nhạc khúc được diễn tấu với nhiều loại tiểu nhạc, đại nhạc, gần 20 điệu múa cung đình đã được phục hồi, dựng được 3 vở tuồng cổ đáp ứng cho các lễ hội và giao lưu văn hoá. Trung tâm tổ chức tốt công tác truyền nghề từ các nghệ nhân nhã nhạc Huế còn lại trên đất Cố đô, Thừa Thiên – Huế; tổ chức 4 lớp đào tạo diễn viên với nhiều chương trình như Nhã nhạc, tuồng và múa cung đình…bổ sung cho Nhà hát Nghệ thuật truyền thống Cung đình Huế.

Bên cạnh đó, Trung tâm cũng tiến hành nhiều cuộc điền dã ở thành phố Huế và các vùng phụ cận, gặp gỡ, tiếp xúc và trò chuyện với nhiều nghệ nhân, nghệ sĩ, những người vốn trước đây đã có thời gian phục vụ và làm việc trong cung dưới thời các vua cuối cùng của triều Nguyễn. Nhiều tư liệu quý về các loại hình Nhã nhạc, tuồng và múa cung đình đã được thu thập, trên cơ sở đó nhóm nghiên cứu đã tập hợp, phân loại và xây dựng thành bộ hồ sơ khoa học. Đến thời điểm hiện tại, bộ hồ sơ khoa học này đã thu được 250 trang viết, giới thiệu về sự nghiệp của nghệ nhân, nghệ sĩ và ký âm các bài bản do họ thể hiện, 22 băng ghi âm, 45 đĩa DVD với nội dung ghi lại các kỹ thuật trình tấu, kỹ năng nghề nghiệp của nghệ nhân, nghệ sĩ thuộc bộ môn Nhã nhạc cung đình Huế.

Tỉnh Thừa Thiên – Huế đang tập trung thực hiện 10 biện pháp trước mắt để bảo tồn Nhã nhạc cung đình Huế (Âm nhạc cung đình Việt Nam) đó là: nghiên cứu xây dựng Trung tâm nghiên cứu Văn hoá phi vật thể vùng Huế; củng cố và phát triển về cơ sở vật chất và diễn viên cho Nhà hát Nghệ thuật truyền thống Cung đình Huế để thành trung tâm của các chương trình biểu diễn nghệ thuật truyền thống Cung đình ở Việt Nam; tiến tới tổ chức định kỳ các chương trình biểu diễn giao lưu nghệ thuật quốc tế giữa Nhã nhạc Cung đình Huế với các nghệ thuật biểu diễn Cung đình của một số nước trong khu vực như Hàn Quốc, Nhật Bản.

Trước mắt, tỉnh Thừa Thiên – Huế tiếp tục cập nhật và bổ sung thông tin, dữ liệu về các nghệ nhân, các nhân chứng của Nhã nhạc; thực hiện các đề tài nghiên cứu khoa học về giá trị lịch sử và nghệ thuật, các hình thức diễn tấu, các bài bản hiện còn và đang bị thất lạc; mở rộng nghiên cứu về các lễ hội cung đình của triều Nguyễn; tiếp tục mở rộng quan hệ hợp tác trong nghiên cứu tư liệu và công nghệ chế tác nhạc cụ truyền thống; quảng bá và cung cấp thông tin cho cộng đồng; chuẩn hoá về chương trình biểu diễn Nhã nhạc và múa cung đình, về trang phục và phong cách biểu diễn…

Theo Baotintuc.vn

Giới thiệu thư viện MvpPattern dùng xây dựng mô hình ứng dụng dựa trên kiến trúc MVP


bởi Nguyễn Thành Mãn vào 8 tháng 1 2013 lúc 17:20 ·

Giới thiệu thư viện MvpPattern dùng để xây dựng mô hình ứng dụng dựa trên kiến trúc Model – View – Presenter 

 

1         Giới thiệu

Trong quá trình thực hiện dự án Phần mềm quản lý tư liệu và Website Nhã nhạc cung đình Huế, từ kinh nghiệm của các dự án trước và qua tìm hiểu tham khảo trên Internet, nhóm thực hiện dự án đã học hỏi, cải tiến và tổ chức lại thành thư viện MvpPattern chạy trên nền tảng .NET, với mục tiêu nâng cao tính tái sử dụng, giảm bớt khối lượng mã cần viết cho các thao tác thường gặp khi xây dựng phần mềm áp dụng theo mô hình Model-View-Presenter (MVP). Mô hình MVP đã khá quen thuộc với giới lập trình nên việc giới thiệu nằm ngoài phạm vi bài viết này. Đây là phiên bản đầu tiên, bước đầu chỉ mới khái quát hóa vấn đề ở mức độ cơ bản, nên có một số điểm vẫn chưa được hoàn thiện, chưa được như mong muốn. Trong quá trình ứng dụng thực tiễn, thư viện sẽ tiếp tục được cải tiến cho phù hợp và tiện lợi hơn. Chúng tôi chia sẻ một số kinh nghiệm và mong nhận được ý kiến đóng góp.

Các ví dụ sử dụng theo cách lập trình truyền thống, chưa đáp ứng hoàn toàn nguyên lý đảo ngược phụ thuộc (Dependency Inversion Principle – DIP[*], cách gọi khác là Inversion of Control – IoC), việc áp dụng nguyên lý này làm giảm bớt sự kết nối (decoupling) chặt chẽ giữa các đối tượng trong phần mềm, tăng độ linh hoạt và giúp phần mềm có tính module hóa cao. Trong khuôn khổ bài viết không thể trình bày đầy đủ, xin tham khảo mã nguồn ví dụ áp dụng thư viện Unity Application Block (phiên bản 2.1) để cài đặt mẫu thiết kế (design pattern) dependency injection.

 

2         Cấu trúc gói

2.1      Biểu đồ gói

Các giao diện và lớp của thư viện.

Vị trí của thư viện trong mô hình MVP.

Ghi chú: Các giao diện và lớp có màu đen là mã ví dụ, không thuộc thành phần của thư viện.

2.2      Tổng quan

Áp dụng thư viện MvpPattern cho phát triển mô hình phần mềm dựa theo kiến trúc ba tầng Model – View – Presenter(MVP). MvpPattern theo cơ chế Passive View, tất cả các tương tác từ tầng giao diện (View) đi xuống và tầng dữ liệu (Model) trở lên đều thông qua tầng trung gian nghiệp vụ (Presenter).

Tầng dữ liệu sử dụng LINQ (LINQ được Microsoft tích hợp vào Visual Studio từ phiên bản 2008. tuy nhiên vẫn có thể dùng trong phiên bản 2005, lưu ý là LINQ chỉ dùng được cho hệ quản trị cơ sở dữ liệu MS SQL Server) và kết hợp với thư viện Dynamic LINQ để tạo các câu truy vấn có điều kiện tương tự câu lệnh truy vấn SQL quen thuộc.

2.2.1      Tầng Business

2.2.1.1  Giao diện IGenericView

Giao diện gốc, với mục đích cho các giao diện khác kế thừa.

public interface IGenericView

{

}

2.2.1.2  Giao diện IListManipulationView

Định nghĩa các thuộc tính và sự kiện thao tác cơ bản là thêm mới, chỉnh sửa, xóa bỏ và lựa chọn khi xử lý dữ liệu trên một danh sách, dẫn xuất từ IGenericView.

public interface IListManipulationView : IGenericView

{

// Trả về hoặc thiết lập danh sách các đối tượng của view

IList ListItem { set; get; }

 

// Trả về đối tượng được tạo mới trên view

TEntity NewItem { get; }

 

// Trả về đối tượng hiện hành trên danh sách của view

TEntity CurrentItem { get; }

 

// Trả về danh sách các đối tượng được lựa chọn trên view

IList SelectedItems { get; }

 

// Sự kiện phát sinh khi thêm một hạng mục dữ liệu mới

event EventHandler OnAddEventHandler;

 

// Sự kiện phát sinh khi lưu trữ thông tin của hạng mục dữ liệu

event EventHandler OnSaveEventHandler;

 

// Sự kiện phát sinh khi xóa bỏ các hạng mục dữ liệu

event EventHandler OnDeleteEventHandler;

 

// Sự kiện phát sinh khi các hạng mục dữ liệu được lựa chọn

event EventHandler OnSelectEventHandler;

}

Ví dụ: Form danh sách người dùng có các thao tác thêm mới, cập nhật và  xóa bỏ. Định nghĩa giao diện IUserView kế thừa từ giao diện IListManipulationView, định nghĩa thêm một số thuộc tính cần thiết khác và thi hành giao diện này cho form.

public interface IUserView : IListManipulationView

Thi hành  giao diện mới cho form:

public partial class frmUser : Form, IUserView

2.2.1.3  Giao diện IListSelectionView

Định nghĩa các thuộc tính và sự kiện khi lựa chọn các hạng mục dữ liệu trên một danh sách, dẫn xuất từ IGenericView.

public interface IListSelectionView : IGenericView

{

// Trả về hoặc thiết lập danh sách các đối tượng của view

IList ListItem { set; get; }

 

// Trả về danh sách các đối tượng được lựa chọn trên view

IList SelectedItems { get; }

 

// Sự kiện phát sinh khi các hạng mục dữ liệu được lựa chọn

event EventHandler OnSelectEventHandler;

}

Người phát triển có thể định nghĩa ra các giao diện mới tùy theo nhu cầu hoặc kế thừa từ các giao diện trên.

Ví dụ: Có một form danh sách người dùng và sử dụng để lựa chọn ra một số người dùng từ danh sách đó, ta định nghĩa giao diện IUserSelectionView kế thừa từ giao diện IListSelectionView, định nghĩa thêm một số thuộc tính cần thiết khác và thi hành giao diện này cho form.

public interface IUserSelectionView : IListSelectionView

Thi hành giao diện cho form:

public partial class dlgUser : Form, IUserSelectionView

2.2.1.4  Lớp tổng quát GenericPresenter

Lớp chứa các phương thức phổ biến khi thực hiện các thao tác xử lý trên danh sách. Người phát triển có thể override các phương thức này tùy theo nhu cầu sử dụng.

Ví dụ tạo presenter kế thừa từ GenericPresenter, mỗi presenter gắn với view mà nó điều khiển:

public class UserPresenter : GenericPresenter

Khởi tạo đối tượng UserPresenter từ view như sau:

public partial class frmUser : Form, IUserView

{

private UserPresenter presenter;

 

private void frmUser_Load(object sender, EventArgs e)

{

// Khởi tạo đối tượng presenter

presenter = new UserPresenter();

// Gắn tham chiếu của form thực thi giao diện cho presenter

presenter.View = this;

2.2.1.4.1   Thuộc tính View

Mô tả: Trả về hoặc thiết lập tham chiếu đến view gắn với presenter. Thao tác gán giá trị cho thuộc tính View gọi phương thức OnViewSet.

Cú pháp:

TView View { get; set; }

Ví dụ: Thiết lập giá trị View cho presenter.

presenter = new UserSelectionPresenter();

presenter.View = this;

2.2.1.4.2   Phương thức OnViewSet

Mô tả: Phương thức được gọi khi thuộc tính view của presenter được gán giá trị (xem 2.2.1.4.1).

Cú pháp: public abstract void OnViewSet();

Ví dụ:

public override void OnViewSet()

{

// Khởi tạo dịch vụ xử lý dữ liệu

service = UserGroupService.Instance;

// Đăng ký hàm nhận thông báo mỗi khi dữ liệu có sự thay đổi

service.DataChanged += new DataChangeHandler(FillData);

// Đăng ký các hàm xử lý sự kiện

RegisterEvents();

// Điền thông tin vào giao diện trong lần đầu chạy ứng dụng

FillData();

}

2.2.1.4.3   Phương thức RegisterEvents

Mô tả: Đăng ký các phương thức xử lý sự kiện xảy ra trên view. Có sẵn bốn  sự kiện thường gặp là tạo mới, chỉnh sửa, xóa bỏ và lựa chọn hạng mục dữ liệu, thông thường với view dẫn xuất từ IListManipulationView thì sử dụng cả bốn sự kiện trên, còn view dẫn xuất từ IListSelectiontionView thì chỉ đăng ký sự kiện OnSelectEventHandler.

Cú pháp: public virtual void RegisterEvents();

Ví dụ:

public override void RegisterEvents()

{

View.OnAddEventHandler += new EventHandler(OnAddEventHandler);

View.OnSaveEventHandler += new EventHandler(OnSaveEventHandler);

View.OnDeleteEventHandler += new EventHandler(OnDeleteEventHandler);

View.OnSelectEventHandler += new EventHandler(OnSelectEventHandler);

}

2.2.1.4.4   Phương thức OnAddEventHandler

Mô tả: Xử lý sự kiện tạo hạng mục dữ liệu mới trên view.

Cú pháp: public virtual void OnAddEventHandler;

Ví dụ:

public override void OnAddEventHandler(object sender, EventArgs e)

{

userService.Insert(View.NewItem);

}

2.2.1.4.5   Phương thức OnSaveEventHandler

Mô tả: Xử lý sự kiện lưu thông tin hạng mục trên view.

Cú pháp: public virtual void OnSaveEventHandler;

Ví dụ:

public override void OnSaveEventHandler(object sender, EventArgs e)

{

userService.Update(View.CurrentItem, “UserID=” + View.CurrentItem.UserID);

}

2.2.1.4.6   Phương thức OnDeleteEventHandler

Mô tả: Xử lý sự kiện xóa bỏ hạng mục dữ liệu trên view.

Cú pháp: public virtual void OnDeleteEventHandler;

Ví dụ:

public override void OnDeleteEventHandler(object sender, EventArgs e)

{

userService.Delete(View.SelectedItems);

}

2.2.1.4.7   Phương thức OnSelectEventHandler

Mô tả: Xử lý sự kiện lựa chọn hạng mục dữ liệu trên view

Cú pháp: public virtual void OnSelectEventHandler;

Ví dụ:

public override void OnSelectEventHandler(object sender, EventArgs e)

{

userService.AddToGroup(View.CurrentGroup, View.SelectedItems);

}

2.2.2      Tầng Data

2.2.2.1       Giao diện IGenericService

Giao diện gốc, với mục đích cho các giao diện khác dẫn xuất.

public interface IGenericService

{

}

2.2.2.2       Giao diện IGenericDataAccessService

Định nghĩa các phương thức xử lý dữ liệu thông dụng, dẫn xuất từ IGenericService. Gồm các phương thức cơ bản như truy vấn, các thao tác thêm mới, cập nhật, xóa bỏ đối tượng và gửi thông báo mỗi khi dữ liệu có sự thay đổi.

2.2.2.3       Lớp tổng quát GenericDataAccessService

Lớp tổng quát này thi hành  từ giao diện IGenericDataAccessService.

2.2.2.3.1   Phương thức khởi tạo đối tượng GenericDataAccessService

Mô tả: Phương thức khởi tạo đối tượng (constructor).

Cú pháp: GenericDataAccessService(System.Data.Linq.DataContext dataContext)

Tham số: Đối tượng Linq.LINQ.DataContext. Thông báo biệt lệ ArgumentNullException nếu tham số bằng Null. Tham số của đối tượng LINQ.DataContext là chuỗi kết nối tới cơ sở dữ liệu.

Trả về: Đối tượng GenericDataAccessService

Ví dụ:

public class UserService : GenericDataAccessService, IUserService

{

// Constructor (strConnectionString là chuỗi kết nối tới cơ sở dữ liệu)

public UserService() : base(new MvpExampleDataContext(strConnectionString)) { }

2.2.2.3.2   Thuộc tính DataContext

Mô tả: Trả về tham chiếu DataContext của đối tượng GenericDataAccessService.

Trả về: Đối tượng LINQ.DataContext

Ví dụ:

// Viết ra chuỗi kết nối đến cơ sở dữ liệu

Console.WriteLine(DataContext.Connection.ConnectionString);

2.2.2.3.3   Phương thức SelectAll

Mô tả: Trả về tất cả đối tượng của một lớp.

Cú pháp: virtual IList SelectAll(string orderByExpression)

Tham số:

orderByExpression: Thứ tự sắp xếp kết quả truy vấn, gồm tên trường và thứ tự sắp xếp ASC hoặc DESC, hoặc để chuỗi rỗng nếu không cần sắp xếp.

Trả về: Danh sách các đối tượng.

Ví dụ: IList users = SelectAll(“UserName ASC”);

2.2.2.3.4   Phương thức SelectBy

Mô tả: Truy vấn đối tượng theo điều kiện lọc.

Cú pháp: 

virtual IList SelectBy(string searchCondition, string orderByExpression)

Tham số:

–         searchCondition: Điều kiện lọc.

–         orderByExpression: Thứ tự sắp xếp kết quả truy vấn, gồm tên trường và thứ tự sắp xếp ASC hoặc DESC, hoặc để chuỗi rỗng nếu không cần sắp xếp.

Ví dụ: userService.SelectBy(“GroupID = 1″, “UserName ASC”);

2.2.2.3.5   Phương thức SelectBy

Mô tả: Truy vấn đối tượng theo điều kiện lọc.

Cú pháp: 

IList SelectBy(int fromItemNumber, int numberOfItems, string searchCondition, string orderByExpression)

Tham số:

–         fromItemNumber: Bắt đầu chọn từ đối tượng thứ fromItemNumber.

–         numberOfItems: Trả về số lượng numberOfItems đối tượng.

–         searchCondition: Điều kiện lọc.

–         orderByExpression: Thứ tự sắp xếp kết quả truy vấn, gồm tên trường và thứ tự sắp xếp ASC hoặc DESC, hoặc để chuỗi rỗng nếu không cần sắp xếp.

Ví dụ: userService.SelectBy(1, 20, “GroupID Null”, “UserName DESC”);

2.2.2.3.6   Phương thức Delete

Mô tả: Xóa bỏ đối tượng theo điều kiện lọc.

Cú pháp:  virtual void Delete(string searchCondition)

Tham số:

searchCondition: Điều kiện lọc.

Ví dụ: userService.Delete(“GroupID = Null”);

2.2.2.3.7   Phương thức Delete

Mô tả: Xóa bỏ một tập các đối tượng.

Cú pháp:  virtual void Delete(IList entities)

Tham số:

entities: Danh sách các đối tượng cần xóa bỏ.

Ví dụ: userService.Delete(View.SelectedItems);

2.2.2.3.8   Phương thức DeleteAll

Mô tả: Xóa bỏ toàn bộ các đối tượng của một lớp.

Cú pháp:  virtual void DeleteAll()

Ví dụ: userService.DeleteAll();

2.2.2.3.9   Phương thức Insert

Mô tả: Thêm mới một đối tượng.

Cú pháp: virtual TEntity Insert(TEntity entity)

Tham số:

entity: Đối tượng mới.

Ví dụ:

User user = new User() { UserName = “X” };

userService.Insert(user);

2.2.2.3.10             Phương thức Update

Mô tả: Override phương thức này để thực hiện cập nhật thông tin một đối tượng.

Cú pháp: virtual void Update(TEntity entity, string searchCondition)

Tham số:

–         entity: Đối tượng chứa thông tin cập nhật.

–         searchCondition: Điều kiện lọc.

Ví dụ:

user.UserName = “Y”;

userService.Update(user, “UserID = 1″);

2.2.2.3.11             Phương thức NotifyDataChanged

Mô tả: Gọi phương thức này để thông báo mỗi khi dữ liệu vừa có sự thay đổi. Phương thức này kích hoạt sự kiện DataChanged trên các presenter và gọi phương thức FillData cập nhật lại dữ liệu trên toàn bộ các presenter có thi hành giao diện IObserver.

Cú pháp:  void NotifyDataChanged()

Ví dụ:

UserGroup group = DataContext.GetTable().Where(obj => obj.GroupID == entity.GroupID).SingleOrDefault();

IList users = SelectBy(searchCondition, “”);

foreach (User user in users)

{

user.UserName = entity.UserName;

user.UserGroup = group;

}

DataContext.SubmitChanges();

NotifyDataChanged();

2.2.2.3.12             Phương thức ClearCache

Mô tả: Xóa bộ đệm dữ liệu.

Cú pháp:  static void ClearCache()

2.2.2.3.13             Hàm delegate DataChangeHandler

Mô tả: Đăng ký nhận sự kiện mỗi khi dữ liệu có sự thay đổi.

Ví dụ: Đăng ký một hàm có tên FillData, phương thức này được kích hoạt mỗi khi dữ liệu có sự thay đổi.

public override void OnViewSet()

{

service = new UserGroupService();

service.DataChanged += new DataChangeHandler(FillData);

 

// Phương thức này thực hiện cập nhật lại thông tin trên view

private void FillData()

{

View.ListItem = service.SelectAll(“GroupName ASC”);

}

 

Có hai cách chặn bắt sự kiện dữ liệu có sự thay đổi, dùng hàm delegate DataChangeHandler hoặc dùng phương thức AttachObserver.  Sự khác biệt của hai phương cách thức này là:

–         Dùng hàm delegate: Chỉ presenter nào đăng ký mới nhận được thông báo.

–         Dùng AttachObserver: Tất cả các presenter nào có đăng ký sẽ cùng nhận được thông báo.

2.2.2.4       Giao diện IObserver

Giao diện IObserver chỉ định nghĩa một phương thức duy nhất là FillData, phương thức được gọi mỗi khi lớp đối tượng Subject có sự thay đổi dữ liệu,  dùng để thực hiện các thao tác cập nhật lại giao diện người dùng.

public interface IObserver

{

void FillData();

}

2.2.2.5       Giao diện ISubject

Định nghĩa các phương thức cho lớp Subject thi hành  (dựa theo Observer pattern).

2.2.2.6       Lớp tổng quát Subject

Lớp đối tượng thi hành  giao tiếp ISubject.

2.2.2.6.1   Phương thức AttachObserver

Mô tả: Đăng ký làm một observer, lớp đăng ký sẽ nhận được thông báo mỗi khi có sự thay đổi dữ liệu từ data service (xem mục 2.2.2.3.14).

Cú pháp: void AttachObserver(IObserver observer)

Tham số:

observer: Tên lớp đối tượng thi hành giao tiếp IObserver.

Ví dụ:

public class UserPresenter : GenericPresenter, IObserver

{

private IUserService userService;

 

public override void OnViewSet()

{

// Lấy single instance của UserService

userService = UserService.Instance;

// Dăng ký presenter này là observer nhận thông báo từ data service.

// Hàm FillData tự động được gọi mỗi khi dữ liệu có sự thay đổi.

userService.AttachObserver(this);

2.2.2.6.2   Phương thức DetachObserver

Mô tả: Hủy đăng ký một observer.

Cú pháp:  void DetachObserver(IObserver observer)

Tham số:

observer: Tên lớp đối tượng thi hành giao tiếp IObserver.

Ví dụ: userService.DetachObserver(this);

2.2.2.6.3   Phương thức DetachAll

Mô tả: Hủy đăng ký toàn bộ observer.

Cú pháp:  void DetachAll()

2.2.2.6.4   Phương thức NotifyObservers

Mô tả: Thông báo dữ liệu có sự thay đổi tới các observer đã đăng ký

Cú pháp:  void NotifyObservers()

Ví dụ: userService.NotifyObservers();

2.2.2.6.5   Thuộc tính Observers

Mô tả: Trả về danh sách các observer đã đăng ký

Trả về:  IList

Ví dụ:

// Tổng số các observer được đăng ký

Console.WriteLine(Observers.Count);

 

3         Nguồn thông tin tham khảo

–         Kiến trúc Model-View-Presenter trong .NET (http://www.fpt.edu.vn/story/kien-truc-model-view-presenter-trong-net)

–         Creating a generic Model-View-Presenter framework (https://dotnetchris.wordpress.com/2009/02/16/creating-a-generic-model-view-presenter-framework)

–         Smart Client Software Factory (http://msdn.microsoft.com/en-us/library/ff648753.aspx)

–         Tài liệu LINQ bản tiếng Việt (http://congthuong.googlecode.com/files/LINQ%20tieng%20viet.pdf)

–         Dynamic LINQ (http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx)

–         Unity Application Block (http://msdn.microsoft.com/en-us/library/hh237493.aspx)

 

4         Ví dụ sử dụng

Tạo hai lớp User và UserGroup với các thuộc tính và quan hệ như sau:

Thiết kế các form cho đối tượng User và UserGroup với các thao tác thêm mới, cập nhật và xóa bỏ. Form UserGroup có thêm chức năng chọn thêm các thành viên vào nhóm chỉ định. Cụ thể có ba form như sau:

–         frmUser quản lý danh sách người dùng.

–         frmUserGroup quản lý danh sách nhóm người dùng.

–         dlgUser để lựa chọn ra một số người dùng từ danh sách người dùng.

1          Tạo một solution với ba project tên là UI, BussinessData (tên project tùy chọn) tương ứng với ba tầng View, Presenter và Model.

–         Project UI chứa các form, là lớp giao diện tương tác với người phát triển (view).

–         Project Business chứa các lớp xử lý nghiệp vụ (business).

–         Project Data chứa các lớp đối tượng dữ liệu và các lớp dịch vụ truy cập dữ liệu (model).

Thêm tham chiếu tới thư viện MvpPattern vào References của ba project trên.

2          Trong project Data sử dụng LINQ để ánh xạ các bảng từ cơ sở dữ liệu quan hệ ra các đối tượng và để truy xuất cơ sở dữ liệu.

  1. Right click vào thư mục Data, chọn Add New Item, LINQ to SQL Classes, đặt tên cho file DBML.
  2. Vào menu View, chọn Server Explorer.
  3. Right click vào Data Connections, chọn Add Connection, chọn tên máy chủ và cơ sở dữ liệu.
  4. Kéo hai bảng Users và UserGroups thả vào file DBML.
  5. Lưu file DBML, các lớp đối tượng được tự động sinh mã trong file MvpExample.designer.cs, người phát triển có thể chỉnh sửa, bổ sung thêm mã bằng cách right click vào file DBML, chọn View Code.

3          Trong project Data, định nghĩa các giao diện và viết mã xử lý cho tầng dữ liệu.

Giao diện cho lớp UserService định nghĩa các phương thức thao tác với lớp User.

public interface IUserService : IGenericDataAccessService

{

// Thêm các thành viên vào nhóm người dùng

void AddToGroup(UserGroup group, IList users);

}

Thi hành giao diện IUserService và viết mã cho lớp UserService.

public class UserService : GenericDataAccessService, IUserService

{

// Constructor

public UserService() : base(new MvpExampleDataContext(LocalConfig.ConnectionString)) { }

Override các phương thức Insert, Update tương ứng.

Giao diện cho lớp UserGroupService định nghĩa các phương thức thao tác với lớp UserGroup.

public interface IUserGroupService : IGenericDataAccessService

{

}

Thực hiện các bước tương tự như với lớp UserService.

4          Trong project Bussiness, tạo các giao diện tương ứng cho các form trên.

Định nghĩa giao diện cho form frmUser và viết mã cho presenter:

public interface IUserView : IListManipulationView

{

IList GroupList { set; }

UserGroup CurrentGroup { get; }

}

UserPresenter quản lý giao diện IUserView.

public class UserPresenter : GenericPresenter, IObserver

{

private IUserService userService;

 

public override void OnViewSet()

{

userService = new UserService.Instance;

userService.AttachObserver(this);

 

groupService = UserGroupService.Instance;

}

 

public void FillData()

{

// Cập nhật thông tin của view ở đây

}

Định nghĩa giao diện cho hộp thoại dlgUser và viết mã cho presenter:

public interface IUserSelectionView : IListSelectionView

{

UserGroup CurrentGroup { get; set; }

}

UserSelectionPresenter quản lý giao diện IUserSelectionView.

 

public class UserSelectionPresenter : GenericPresenter

{

private IUserService userService;

 

public override void OnViewSet()

{

userService = UserService.Instance;

Định nghĩa giao diện cho form frmUserGroup và viết mã cho presenter:

public interface IUserGroupView : IListManipulationView

{

}

UserGroupPresenter quản lý giao diện IUserGroupView. Ngoài cách đăng ký làm một observer, còn cách khác là đăng ký một hàm nhận sự kiện. Trong ví dụ dưới đây hàm có tên là FillData.

public class UserGroupPresenter : GenericPresenter

{

private IUserGroupService groupService;

 

public override void OnViewSet()

{

groupService = new UserGroupService();

groupService.DataChanged += new DataChangeHandler(FillData);

}

 

private void FillData()

{

// Cập nhật thông tin của view ở đây

}

5          Trong project UI, tạo các form fmrUser, frmUserGroup và dlgUser.

Tạo form frmUser và thi hành giao diện IUserView

public partial class frmUser : Form, IUserView

Tạo hộp thoại dlgUser và thi hành giao diện IUserSelectionView

public partial class dlgUser : Form, IUserSelectionView

Tạo form frmUserGroup và thi hành giao diện IUserGroupView

public partial class frmUserGroup : Form, IUserGroupView

6. Tương tác giữa các tầng với nhau:

Khi người dùng cập nhật thông tin của một đối tượng, ấn nút Lưu, tầng UI sẽ gửi thông tin tới tầng như sau:

private void btnSave_Click(object sender, EventArgs e)

{

// CurrentItem là đối tượng hiện hành được cập nhật dữ liệu

CurrentItem.UserName = tbxName.Text.Trim();

CurrentItem.UserGroup = CurrentGroup;

// Phát sinh sự kiện lưu trữ gửi tới presenter

if (OnSaveEventHandler != null)

OnSaveEventHandler(this, e);

Tầng presenter lấy đối tượng vừa rồi, gọi phương thức Update của userService để cập nhật vào cơ sở dữ liệu:

public override void OnSaveEventHandler(object sender, EventArgs e)

{

userService.Update(View.CurrentItem, “UserID=” + View.CurrentItem.UserID);

}

 

Tải mã nguồn ví dụ:

–         MvpPatternExample.rar (http://www.mediafire.com/?fqcznsk5s4euvu4)

–         MvpPatternDIPExample.rar (http://www.mediafire.com/?u91e7keg8qr8mv5)

 

ManNT – R&D, HueCIT (bài cho HW) 

09/01/2013

 

 

[*] Nguyên lý đảo ngược phụ thuộc (Dependency Injection): Lớp cấp cao không nên phụ thuộc vào lớp cấp thấp, cả hai nên phụ thuộc vào một lớp tổng quát (abstract class/interface); và, lớp tổng quát (abstract) không nên phụ thuộc vào lớp cụ thể (concrete), ngược lại lớp cụ thể nên phụ thuộc vào lớp trừu tượng. Do lớp tổng quát ít có sự thay đổi, ổn định hơn so với lớp cụ thể thường xuyên có sự thay đổi, chỉnh sửa nâng cấp; và khi phụ thuộc vào các lớp tổng quát, hệ thống vẫn hoạt động bình thường nếu có sự thay đổi diễn ra tại một lớp cụ thể nào đó. Bởi vậy, cần đảo ngược sự phụ thuộc đó thành lớp cụ thể phụ thuộc vào lớp tổng quát.