نموذج - عرض - وحدة تحكم

نموذج-عرض-وحدة تحكم ( MVC ) هو نمط تصميم برمجي [1] يستخدم عادة لتطوير واجهات المستخدم التي تقسم منطق البرنامج المرتبط إلى ثلاثة عناصر مترابطة. هذه العناصر هي:

  • النموذج ، التمثيلات الداخلية للمعلومات
  • العرض ، الواجهة التي تعرض المعلومات على المستخدم وتقبلها منه
  • المتحكم ، البرنامج الذي يربط بين الاثنين. [ 2 ] [3]

يستخدم هذا النمط تقليديًا لواجهات المستخدم الرسومية لسطح المكتب (GUIs)، وأصبح شائعًا لتصميم تطبيقات الويب . [4] تحتوي لغات البرمجة الشائعة على أطر عمل MVC تسهل تنفيذ النمط.

تاريخ

كانت MVC واحدة من الأفكار المحورية في التطوير المبكر لواجهات المستخدم الرسومية، وأصبحت واحدة من أولى الطرق لوصف وتنفيذ بنيات البرامج من حيث مسؤولياتها . [ 5]

أنشأ تريغفي ريينسكاوج MVC أثناء عمله على Smalltalk -79 كعالم زائر في مركز أبحاث Xerox Palo Alto (PARC) في أواخر السبعينيات. [6] [7] [8] :  330 أراد نمطًا يمكن استخدامه لبناء أي برنامج يتفاعل فيه المستخدمون مع مجموعة بيانات كبيرة ومعقدة . كان تصميمه يتكون في البداية من أربعة أجزاء: النموذج والعرض والشيء والمحرر. بعد مناقشته مع مطوري Smalltalk الآخرين ، استقر هو وبقية المجموعة على النموذج والعرض ووحدة التحكم بدلاً من ذلك. [6]

في تصميمها النهائي، يمثل النموذج جزءًا من البرنامج بشكل بديهي وبحت. العرض هو تمثيل مرئي للنموذج، حيث يقوم باسترجاع البيانات من النموذج لعرضها على المستخدم وتمرير الطلبات ذهابًا وإيابًا بين المستخدم والنموذج. وحدة التحكم هي جزء تنظيمي من واجهة المستخدم التي تضع وتنسق بين عروض متعددة على الشاشة، والتي تتلقى مدخلات المستخدم وترسل الرسائل المناسبة إلى عروضها الأساسية. يتضمن هذا التصميم أيضًا محررًا كنوع متخصص من وحدة التحكم المستخدمة لتعديل عرض معين، والذي يتم إنشاؤه من خلال هذا العرض. [6]

يدعم Smalltalk-80 إصدارًا من MVC تطور من هذا الإصدار. [6] فهو يوفر فئات مجردة viewوفئات فرعية ملموسة مختلفة لكل منها تمثل أدوات عامة مختلفة . في هذا المخطط، يمثل a طريقة ما لعرض المعلومات للمستخدم، ويمثل a طريقة ما للمستخدم للتفاعل مع a . كما يتم ربط A أيضًا بكائن نموذجي، ولكن بنية هذا الكائن تُترك لمبرمج التطبيق . تتضمن بيئة Smalltalk-80 أيضًا "MVC Inspector"، وهي أداة تطوير لعرض بنية نموذج وعرض ووحدة تحكم معينة جنبًا إلى جنب. [9]controller Viewcontrollerviewview

في عام 1988، قدم مقال في مجلة تقنية الكائنات (JOT) من تأليف اثنين من الموظفين السابقين في PARC MVC باعتباره " نموذجًا ومنهجية برمجة " عامة لمطوري Smalltalk-80. ومع ذلك، اختلف مخططهم عن مخطط Reenskaug وآخرين والمقدم في كتب مرجعية Smalltalk-80. لقد عرفوا العرض بأنه يغطي أي اهتمام رسومي، مع كون وحدة التحكم عبارة عن كائن أكثر تجريدًا وغير مرئي بشكل عام يتلقى مدخلات المستخدم ويتفاعل مع عرض واحد أو أكثر ونموذج واحد فقط. [10]

تطور نمط MVC لاحقًا، [11] مما أدى إلى ظهور متغيرات مثل نموذج العرض الهرمي (HMVC)، ومحول النموذج العرض (MVA)، والنموذج العرض المقدم (MVP)، والنموذج العرض-نموذج العرض (MVVM)، وغيرها التي تكيفت مع MVC في سياقات مختلفة.

زاد استخدام نمط MVC في تطبيقات الويب بعد تقديم WebObjects من NeXT في عام 1996، والذي تم كتابته في الأصل بلغة Objective-C (التي استعارت بشكل كبير من Smalltalk) وساعدت في فرض مبادئ MVC. لاحقًا، أصبح نمط MVC شائعًا لدى مطوري Java عندما تم نقل WebObjects إلى Java . استمرت الأطر اللاحقة لـ Java، مثل Spring (تم إصدارها في أكتوبر 2002)، في تعزيز الرابطة القوية بين Java وMVC.

في عام 2003، نشر مارتن فاولر أنماط هندسة تطبيقات المؤسسة ، والتي قدمت MVC كنمط حيث يتلقى "وحدة تحكم الإدخال" طلبًا، ويرسل الرسائل المناسبة إلى كائن النموذج، ويأخذ استجابة من كائن النموذج، ويمرر الاستجابة إلى العرض المناسب للعرض. [8] :  56 هذا قريب من النهج الذي اتخذه إطار عمل تطبيق الويب Ruby on Rails (أغسطس 2004)، والذي يجعل العميل يرسل طلبات إلى الخادم عبر عرض داخل المتصفح ، ويتم التعامل مع هذه الطلبات بواسطة وحدة تحكم على الخادم، وتتواصل وحدة التحكم مع كائنات النموذج المناسبة. [12] طرح إطار عمل Django (يوليو 2005، لـ Python ) "عرض قالب النموذج" (MTV) مشابهًا للنمط، حيث يسترد العرض البيانات من النماذج ويمررها إلى قوالب للعرض. [13] ظهر كل من Rails وDjango مع التركيز القوي على النشر السريع، مما زاد من شعبية MVC خارج بيئة المؤسسة التقليدية التي كانت شائعة فيها منذ فترة طويلة.

عناصر

نموذج

المكون المركزي للنمط. إنه بنية البيانات الديناميكية للتطبيق ، مستقلة عن واجهة المستخدم. [14] يدير بشكل مباشر البيانات والمنطق وقواعد التطبيق. في Smalltalk-80، يُترك تصميم نوع النموذج بالكامل للمبرمج. [15] مع WebObjects و Rails و Django، يمثل نوع النموذج عادةً جدولًا في قاعدة بيانات التطبيق . [16] [17] [18] النموذج ضروري للحفاظ على البيانات منظمة ومتسقة. فهو يضمن أن تتصرف بيانات التطبيق وفقًا للقواعد والمنطق المحددين.

منظر

أي تمثيل للمعلومات مثل الرسم البياني أو الرسم التخطيطي أو الجدول. ومن الممكن عرض المعلومات نفسها بطرق متعددة، مثل الرسم البياني الشريطي للإدارة والعرض الجدولي للمحاسبين .

في Smalltalk-80، يكون العرض مجرد تمثيل مرئي للنموذج، ولا يتعامل مع إدخال المستخدم. [19] مع WebObjects، يمثل العرض عنصر واجهة مستخدم كامل مثل القائمة أو الزر، ويتلقى إدخالاً من المستخدم. [20] ومع ذلك، في كل من Smalltalk-80 وWebObjects، من المفترض أن تكون العروض عامة وقابلة للتكوين . [21] [22]

مع Rails وDjango، يتم لعب دور العرض بواسطة قوالب HTML ، لذلك في مخططهم يحدد العرض واجهة مستخدم داخل المتصفح بدلاً من تمثيل عنصر واجهة مستخدم بشكل مباشر. [23] [24] (يختار Django تسمية هذا النوع من الكائنات "قالبًا" في ضوء هذا. [25] ) يضع هذا النهج تأكيدًا أقل نسبيًا على العروض الصغيرة القابلة للتكوين؛ يتمتع عرض Rails النموذجي بعلاقة فردية مع إجراء وحدة تحكم. [26]

تتواصل عروض Smalltalk-80 مع كل من النموذج ووحدة التحكم، [27] بينما مع WebObjects، تتحدث العرض فقط إلى وحدة تحكم، والتي تتحدث بدورها إلى نموذج. [28] مع Rails وDjango، يتم استخدام العرض/القالب بواسطة وحدة تحكم/عرض عند تحضير استجابة للعميل. [29] [30]

وحدة التحكم

يقبل المدخلات ويحولها إلى أوامر للنموذج أو العرض. [31]

تتولى وحدة تحكم Smalltalk-80 التعامل مع أحداث إدخال المستخدم، مثل الضغط على الأزرار أو تحريك الماوس. [32] وفي أي وقت معين، يكون لكل وحدة تحكم عرض ونموذج مرتبطان، على الرغم من أن كائن نموذج واحد قد يسمع من العديد من وحدات التحكم المختلفة. تتلقى وحدة تحكم واحدة فقط، وحدة التحكم "النشطة"، إدخال المستخدم في أي وقت معين؛ ويكون كائن مدير النافذة العالمي مسؤولاً عن ضبط وحدة التحكم النشطة الحالية. إذا طالب إدخال المستخدم بتغيير في نموذج، فإن وحدة التحكم ستشير إلى النموذج بالتغيير، ولكن النموذج مسؤول بعد ذلك عن إخبار عروضه بالتحديث. [33]

في WebObjects، تتولى العروض معالجة إدخال المستخدم، ويتوسط المتحكم بين العروض والنماذج. قد يكون هناك متحكم واحد فقط لكل تطبيق، أو متحكم واحد لكل نافذة. يوجد الكثير من المنطق الخاص بالتطبيق في المتحكم. [34]

في Rails، يتم إرسال الطلبات التي تصل إلى التطبيق الموجود على الخادم من العميل إلى " جهاز توجيه "، والذي يربط الطلب بطريقة معينة لوحدة تحكم معينة. داخل هذه الطريقة، تتفاعل وحدة التحكم مع بيانات الطلب وأي كائنات نموذجية ذات صلة وتعد استجابة باستخدام عرض. تقليديًا، يكون لكل عرض وحدة تحكم مرتبطة؛ على سبيل المثال، إذا كان للتطبيق عرض client، فمن الطبيعي أن يكون له وحدة تحكم مرتبطة Clientsأيضًا. ومع ذلك، يتمتع المطورون بحرية إنشاء أنواع أخرى من وحدات التحكم إذا رغبوا في ذلك. [35]

يُطلق Django على الكائن الذي يلعب هذا الدور اسم "view" بدلاً من وحدة تحكم. [30] يُعد عرض Django دالة تتلقى طلب ويب وتعيد استجابة ويب. قد تستخدم قوالب لإنشاء الاستجابة. [36]

التفاعلات

بالإضافة إلى تقسيم التطبيق إلى نموذج وعرض ومكون وحدة تحكم، يحدد نمط تصميم MVC التفاعلات بين هذه المكونات الثلاثة: [37]

  • النموذج مسؤول عن إدارة بيانات التطبيق، ويستقبل مدخلات المستخدم من وحدة التحكم.
  • يتيح لك العرض عرض النموذج بتنسيق معين.
  • يستجيب المتحكم لإدخال المستخدم وينفذ تفاعلات على كائنات نموذج البيانات. يتلقى المتحكم الإدخال، ويتحقق من صحته بشكل اختياري ثم يمرر الإدخال إلى النموذج.

كما هو الحال مع أنماط البرمجيات الأخرى، يعبر MVC عن "جوهر الحل" لمشكلة مع السماح بتكييفه مع كل نظام. [38] يمكن أن تختلف تصميمات MVC المحددة بشكل كبير عن الوصف التقليدي هنا. [39]

تحفيز

كما كتب آلان كاي في عام 2003، كان الدافع الأصلي وراء MVC هو السماح بإنشاء واجهة رسومية لأي كائن. [40] وقد تم توضيح ذلك بالتفصيل في كتاب ريتشارد باوسون Naked Objects . [40]

كتب تريغفي ريينسكاوج، مبتكر MVC في PARC، أن "MVC تم تصميمه كحل عام لمشكلة المستخدمين الذين يتحكمون في مجموعة بيانات كبيرة ومعقدة." [6]

في دليلهم الصادر عام 1991 بعنوان Inside Smalltalk ، وصف أساتذة علوم الكمبيوتر بجامعة كارلتون ويلف لالوند وجون بوغ مزايا MVC على غرار Smalltalk-80 على النحو التالي:

  • استقلال العرض والبيانات، على سبيل المثال وجهات نظر متعددة على نموذج واحد في وقت واحد،
  • أدوات عرض قابلة للتكوين، على سبيل المثال، يتم استخدام عرض واحد كعرض فرعي لآخر،
  • أوضاع الإدخال القابلة للتبديل، عن طريق تبديل وحدة تحكم بأخرى أثناء وقت التشغيل [ يحتاج إلى توضيح ] ، و
  • استقلال معالجة الإدخال والإخراج، من خلال المسؤوليات المنفصلة لوحدات التحكم والمشاهدات. [41]

الاستخدام في تطبيقات الويب

على الرغم من تطويره في الأصل للحوسبة المكتبية ، فقد تم اعتماد MVC على نطاق واسع كتصميم لتطبيقات الويب العالمية في لغات البرمجة الرئيسية . تم إنشاء العديد من أطر عمل الويب التي تفرض النمط. تختلف أطر عمل البرامج هذه في تفسيراتها، وخاصة في الطريقة التي يتم بها تقسيم مسؤوليات MVC بين العميل والخادم . [42] اتخذت أطر عمل MVC المبكرة نهج العميل الرقيق الذي وضع منطق النموذج والعرض ووحدة التحكم بالكامل تقريبًا على الخادم. في هذا النهج، يرسل العميل طلبات ارتباط تشعبي أو عمليات إرسال نماذج إلى وحدة التحكم ثم يتلقى صفحة ويب كاملة ومحدثة (أو مستند آخر) من العرض؛ يوجد النموذج بالكامل على الخادم. [42] سمحت الأطر اللاحقة لمكونات MVC بالتنفيذ جزئيًا على العميل، باستخدام Ajax لمزامنة البيانات.

انظر أيضا

مراجع

  1. ^ "مبادئ العمارة النظيفة بقلم العم بوب مارتن". يوتيوب . 15 ديسمبر 2015.
  2. ^ Reenskaug, Trygve; Coplien, James O. (20 March 2009). "The DCI Architecture: A New Vision of Object-Oriented Programming". Artima Developer . مؤرشف من الأصل في 23 مارس 2009 . تم الاسترجاع في 3 أغسطس 2019 . وبشكل أعمق، يوجد الإطار لفصل تمثيل المعلومات عن تفاعل المستخدم.
  3. ^ بوربيك (1992): "... مدخلات المستخدم، ونمذجة العالم الخارجي، والتغذية المرئية للمستخدم يتم فصلها بشكل صريح ويتم التعامل معها من خلال ثلاثة أنواع من الكائنات."
  4. ^ ديفيس، إيان. "ما هي فوائد MVC؟". Internet Alchemy . تم الاسترجاع في 2016-11-29 .
  5. ^ تاريخ النموذج-العرض-وحدة التحكم. C2.com (2012-05-11). تم الاسترجاع في 2013-12-09.
  6. ^ ملاحظات ووثائق تاريخية من Trygve Reenskaug، مخترع MVC.
  7. ^ "ملاحظة حول متطلبات DynaBook"، Trygve Reenskaug، 22 مارس 1979، SysReq.pdf.
  8. ^ ab Fowler, Martin (2003). Patterns of Enterprise Application Architecture . Pearson Education, Inc. ISBN 0-321-12742-0.
  9. ^ جولدبرج، أديل (1984). Smalltalk-80: بيئة البرمجة التفاعلية . أديسون ويسلي. ISBN 0-201-11372-4.
  10. ^ Krasner, Glenn E.; Pope, Stephen T. (Aug–Sep 1988). "كتاب وصفات لاستخدام نموذج واجهة المستخدم لوحدة التحكم في العرض والنموذج في Smalltalk-80". مجلة تكنولوجيا الكائنات . 1 (3). منشورات SIGS: 26–49.نُشرت أيضًا تحت عنوان "وصف نموذج واجهة المستخدم النموذج-العرض-وحدة التحكم في نظام Smalltalk-80" (تقرير)، ParcPlace Systems؛ تم استرجاعها في 2012-06-05.
  11. ^ تطور MVC وهياكل واجهة المستخدم الأخرى من مارتن فاولر.
  12. ^ "أدلة Ruby on Rails" . تم الاسترجاع في 19 مارس 2022 .
  13. ^ "Django FAQ: يبدو أن Django عبارة عن إطار عمل MVC، ولكنك تطلق على وحدة التحكم اسم "view"، وعلى العرض اسم "template". لماذا لا تستخدم الأسماء القياسية؟" . تم الاسترجاع في 19 مارس 2022 .
  14. ^ بوربيك، ستيف (1992) برمجة التطبيقات في Smalltalk-80: كيفية استخدام نموذج-عرض-وحدة تحكم (MVC)
  15. ^ LaLonde, Wilf R.; Pugh, John R. (1991). Inside Smalltalk. الولايات المتحدة الأمريكية: Prentice-Hall Inc. ص. 8. ISBN 0-13-467309-3يمكن أن يكون النموذج أي كائن دون قيود.
  16. ^ نظرة عامة على نظام WebObjects (PDF) . كوبرتينو، كاليفورنيا: شركة Apple Computer, Inc. مايو 2001. ص 28. في WebObjects، يقوم النموذج بإنشاء وصيانة المراسلات بين فئة كائن المؤسسة والبيانات المخزنة في قاعدة بيانات علائقية.
  17. ^ "أساسيات Active Record". Rails Guides . تم الاسترجاع في 27 أكتوبر 2022. سيؤدي هذا إلى إنشاء نموذج، يتم تعيينه على جدول المنتجات في قاعدة البيانات.Product
  18. ^ "النماذج". وثائق Django . تم ​​الاسترجاع في 27 أكتوبر 2022. بشكل عام، يتم ربط كل نموذج بجدول قاعدة بيانات واحد.
  19. ^ LaLonde, Wilf R.; Pugh, John R. (1991). Inside Smalltalk. الولايات المتحدة الأمريكية: Prentice-Hall Inc. ص. 8. ISBN 0-13-467309-3. العرض مسؤول عن توفير تمثيل مرئي للكائن.
  20. ^ نظرة عامة على نظام WebObjects (PDF) . كوبرتينو، كاليفورنيا: شركة Apple Computer, Inc. مايو 2001. ص 28. تمثل كائنات العرض الأشياء المرئية على واجهة المستخدم (النوافذ، على سبيل المثال، أو الأزرار).
  21. ^ LaLonde, Wilf R.; Pugh, John R. (1991). Inside Smalltalk. الولايات المتحدة الأمريكية: Prentice-Hall Inc. ص. 8. ISBN 0-13-467309-3[ MVC ] يسمح باستخدام العروض كأجزاء للتجميع في وحدات أكبر؛ ويمكن إنشاء أنواع جديدة من العروض باستخدام العروض الموجودة كعروض فرعية.
  22. ^ نظرة عامة على نظام WebObjects (PDF) . كوبرتينو، كاليفورنيا: شركة Apple Computer, Inc. مايو 2001. ص 28. تميل كائنات العرض إلى أن تكون قابلة لإعادة الاستخدام بشكل كبير وبالتالي توفر الاتساق بين التطبيقات.
  23. ^ "نظرة عامة على عرض الإجراءات". Rails Guides . تم الاسترجاع في 27 أكتوبر 2022. تتم كتابة قوالب عرض الإجراءات باستخدام Ruby المضمنة في العلامات الممزوجة بـ HTML.
  24. ^ "القوالب". توثيق Django . تم ​​الاسترجاع في 27 أكتوبر 2022. يحتوي القالب على الأجزاء الثابتة من الناتج HTML المطلوب بالإضافة إلى بعض القواعد النحوية الخاصة التي تصف كيفية إدراج المحتوى الديناميكي.
  25. ^ "Django FAQ: يبدو أن Django عبارة عن إطار عمل MVC، ولكنك تطلق على وحدة التحكم اسم "view"، وعلى العرض اسم "template". لماذا لا تستخدم الأسماء القياسية؟" . تم الاسترجاع في 27 أكتوبر 2022 .
  26. ^ "نظرة عامة على عرض الإجراء". Rails Guides . تم الاسترجاع في 27 أكتوبر 2022. عادةً، تتشارك العروض اسمها مع إجراء وحدة التحكم المرتبطة...
  27. ^ LaLonde, Wilf R.; Pugh, John R. (1991). Inside Smalltalk. الولايات المتحدة الأمريكية: Prentice-Hall Inc. ص. 9. ISBN 0-13-467309-3... العرض يعرف صراحةً عن النموذج ووحدة التحكم.
  28. ^ نظرة عامة على نظام WebObjects (PDF) . كوبرتينو، كاليفورنيا: شركة Apple Computer, Inc. مايو 2001. ص 28. يعمل كائن وحدة التحكم كوسيط بين كائنات النموذج وكائنات العرض في التطبيق.
  29. ^ "نظرة عامة على عرض الإجراء". أدلة Rails . تم الاسترجاع في 27 أكتوبر 2022. في Rails، تتم معالجة طلبات الويب بواسطة وحدة تحكم الإجراء وعرض الإجراء. عادةً، تكون وحدة تحكم الإجراء معنية بالتواصل مع قاعدة البيانات وتنفيذ إجراءات CRUD عند الضرورة. ثم تكون عرض الإجراء مسؤولة عن تجميع الاستجابة.
  30. ^ ab "Django FAQ: Django seems to be a MVC framework, but you called the Controller the "view", and the View the "template". Why come you don't use the standard names?" . تم الاسترجاع في 27 أكتوبر 2022 . في Django، يصف "view" البيانات التي يتم تقديمها، ولكن عادةً ما يقوم العرض بالتفويض إلى قالب، والذي يصف كيفية تقديم البيانات.
  31. ^ مثال بسيط لنمط معماري MVC (نموذج-عرض-وحدة تحكم) للتجريد
  32. ^ LaLonde, Wilf R.; Pugh, John R. (1991). Inside Smalltalk. الولايات المتحدة الأمريكية: Prentice-Hall Inc. ص. 8. ISBN 0-13-467309-3. وحدة التحكم مسؤولة عن التفاعل بين المستخدم والنموذج/العرض. فهي تفسر أحرف لوحة المفاتيح جنبًا إلى جنب مع حركات الماوس والنقر.
  33. ^ LaLonde, Wilf R.; Pugh, John R. (1991). Inside Smalltalk. الولايات المتحدة الأمريكية: Prentice-Hall Inc. ص. 11. ISBN 0-13-467309-3.
  34. ^ نظرة عامة على نظام WebObjects (PDF) . كوبرتينو، كاليفورنيا: Apple Computer, Inc. مايو 2001. ص 28.
  35. ^ "نظرة عامة على عرض الإجراء". Rails Guides . تم الاسترجاع في 27 أكتوبر 2022. عادةً، تتشارك العروض اسمها مع إجراء وحدة التحكم المرتبطة...
  36. ^ "كتابة وجهات النظر". توثيق Django . تم ​​الاسترجاع في 27 أكتوبر 2022 .
  37. ^ بوشمان، فرانك (1996) هندسة البرمجيات الموجهة للأنماط .
  38. ^ جاما، إيريش وآخرون. (1994) أنماط التصميم
  39. ^ مور، دانا وآخرون (2007) تطبيقات الإنترنت الغنية المهنية: أجاكس وما بعده : "منذ نشأة MVC، كانت هناك العديد من التفسيرات للنمط. وقد تم تكييف المفهوم وتطبيقه بطرق مختلفة للغاية على مجموعة واسعة من الأنظمة والهندسة المعمارية."
  40. ^ بواسطة آلان كاي (23 مايو 2003). "هل Squeak موجه للكائنات حقًا؟". قائمة بريدية لمؤسسة Squeak . تم الاسترجاع في 26 أكتوبر 2021 .
  41. ^ LaLonde, Wilf R.; Pugh, John R. (1991). Inside Smalltalk. المجلد 2. الولايات المتحدة الأمريكية: Prentice-Hall Inc. ص 8-9. ISBN 0-13-467309-3.
  42. ^ ab Leff, Avraham; Rayfield, James T. (سبتمبر 2001). تطوير تطبيقات الويب باستخدام نمط تصميم النموذج/العرض/وحدة التحكم . مؤتمر الحوسبة الموزعة للكائنات التابع لمعهد مهندسي الكهرباء والإلكترونيات للمؤسسات. ص 118-127.

فهرس

تم الاسترجاع من "https://en.wikipedia.org/w/index.php?title=نموذج–عرض–وحدة تحكم&oldid=1244967192"
Original text
Rate this translation
Your feedback will be used to help improve Google Translate