فهم النموذج الأولي

(أ) نمط التصميم الأولي هو نمط تصميمي مبتكر يرتكز على مفهوم استنساخ الأجسام الموجودة بدلاً من بناء أشياء جديدة من الصفر، وهو أمر ذو قيمة خاصة عندما تكون تكلفة إنشاء حالة جديدة من الدرجة أكثر تكلفة من نسخ واحدة موجودة، أو عندما يكون النظام مستقلاً عن كيفية إنشاء أجسامه، وفي جافاسكربت، يمكن استنساخ الأشياء بسهولة باستخدام [(FLT:0] أو النموذج المنسَّق.

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

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

النموذج الأولي في فوي.ج

مكونات الـ (فـا سـكـريـبـت) هي أساساً أشياء من نوع (جـافـا سـكريـب) تحدد نموذجاً وبيانات وطرقاً وخواص حاسوبية وخطاف دورة الحياة، فـي ضوء هذا الطابع الموجه نحو الجسم، يدعم بطبيعة الحال الميراث القائم على النموذج الأولي، ويوفر الإطار عدة آليات لتنفيذ النموذج الأولي:

  • التمديد المُتَسَمَّل عبر ] ] [Fue's ]
  • Mixins]: A mixin is a reusable block of component options that can be merged into any component, effectively cloning behavior across multiple prototypes.
  • Composables (Composition API): With Vue 3, composable functions enable logical reuse without relying on object inheritance, offering a more flexible form of prototype cloning.
  • Dynamic component cloning]: Using or ] together with or spread operators, developers can create new component definitions based on existing ones at runtime.

(النموذج الأولي (باترن) يتوافق مع نظام رد الفعل الخاص بـ(فوي عندما تستنسخ تعريفاً مكوّناً، فإنّ المكوّن الناتج لا يزال يتفاعل مع تغيرات البيانات و أحداث دورة الحياة كما هو متوقع، وهذا يجعل من المستقيم بناء أسرة مكونة من وحدة الاستخبارات المشتركة التي تتقاسم مجموعة أساسية من الملامح ولكنّة مختلفة في المظهر أو السلوك.

النموذج الأولي للنموذج مع الخيارات

وفي الخيارين 2 و3، يمكن استخدام خيار لخلق عنصر للطفل الذي يرث من عنصر الوالدين، ويمكن لعنصر الطفل أن يلغي أي خيارات (البيانات، والأساليب، والحساب، وما إلى ذلك) مع الاحتفاظ بالباقي، وهذا هو أقرب تنفيذ للنموذج الأولي التقليدي.

// BaseButton.js
export default {
 name: 'BaseButton',
 props: {
 label: { type: String, default: 'Click me' }
 },
 data() {
 return {
 isDisabled: false
 }
 },
 methods: {
 handleClick() {
 this.$emit('click')
 }
 },
 template: `<button :disabled="isDisabled" @click="handleClick" class="btn btn-primary">{{ label }}</button>`
}

// SecondaryButton.js
import BaseButton from './BaseButton'
export default {
 extends: BaseButton,
 data() {
 return {
 isDisabled: false
 }
 },
 template: `<button :disabled="isDisabled" @click="handleClick" class="btn btn-secondary">{{ label }}</button>`
}

In this example, ] is a clone of with a modified template and CSS class. The props, data, and methods are inherited, but can be overridden.

النموذج الأولي للنموذج

"في المرحلة الثالثة من "البرنامج التكويني يشجع على استخدام الوظائف المُركبة بدلاً من الميراث لكن يمكنكِ أن تنفذي المفهوم الأولي من خلال إنشاء وظيفة مصنعية تعيد موضوع تعريف مُكون ثم تُنشره في عنصر جديد هذا النهج أكثر وضوحاً وتتجنبين الدمج في الخيار العميق

// useButtonPrototype.js
import { ref } from 'vue'
export function useButtonPrototype() {
 const isDisabled = ref(false)
 function handleClick(emit) {
 emit('click')
 }
 return { isDisabled, handleClick }
}

// BaseButton.vue
<script setup>
import { useButtonPrototype } from './useButtonPrototype'
const emit = defineEmits(['click'])
const { isDisabled, handleClick } = useButtonPrototype()
</template>
<template>
 <button :disabled="isDisabled" @click="handleClick(emit)" class="btn btn-primary">
 <slot />
 </button>
</template>

// SecondaryButton.vue
<script setup>
import { useButtonPrototype } from './useButtonPrototype'
const emit = defineEmits(['click'])
const { isDisabled, handleClick } = useButtonPrototype()
// Add secondary logic here
</template>
<template>
 <button :disabled="isDisabled" @click="handleClick(emit)" class="btn btn-secondary">
 <slot />
 </button>
</template>

وهنا، يُستخرج المنطق الأولي إلى مركب، وكل عنصر يستنسخ هذا المنطق، وغالبا ما يكون هذا النمط أكثر للحفاظ على سلاسل الميراث العميقة.

إنشاء عنصر قاعدة قابل للتداول

الخطوة الأولى في تطبيق النموذج الأولي في فو هي تصميم عنصر أساسي متين، وينبغي لهذا العنصر أن يلخص الهيكل والسلوك المشترك اللذين سيتقاسمهما جميع المتغيرات، وفيما يتعلق بعنصر من وحدة التفتيش المشتركة مثل الزر، يشمل ما يلي:

  • A or ] wrapper with accessible attributes.
  • Props for customization: , , , etc.
  • -مجالات لتوقعات المحتوى
  • حدث مرّات للتفاعلات
  • وضع مواصفات مشتركة عن طريق صفوف خدمات الدعم المركزية أو نظام تصميم.

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

<template>
 <transition name="fade">
 <div v-if="visible" class="dialog-overlay" @click.self="close">
 <div class="dialog" :class="sizeClass">
 <button class="dialog-close" @click="close">&times;</button>
 <div class="dialog-body">
 <slot />
 </div>
 </div>
 </div>
 </transition>
</template>

<script>
export default {
 props: {
 visible: Boolean,
 size: { type: String, default: 'medium' }
 },
 computed: {
 sizeClass() { return `dialog--${this.size}` }
 },
 methods: {
 close() { this.$emit('update:visible', false) }
 }
}
</script>

ويمكن بعد ذلك استنساخ هذا الرقم الأساسي لإنشاء أجهزة تأكيد، أو تشكيل أجهزة الاتصال، أو وسائل الإعلام عن طريق توسيع نطاق تشغيلها.

المكونات المتعلقة بالاختناق والتوسع

(فو) يوفر عدة طرق للإستنساخ وتوسيع المكونات الخيار هو أكثر الخيارات وضوحاً للتعديلات الصغيرة، ولكن توخي الحذر إزاء الإرث العميق: يدمج (Vue) الخيارات في أمر محدد (خيارات سرية خاصة يمتد إلى مزيج من الاختلاط) ويمكن أن يؤدي تجاوز خصائص البيانات أو أساليبها إلى سلوك غير متوقع إذا لم تكن حذراً.

استخدام للتغيرات البسيطة

// ConfirmDialog.js
import BaseDialog from './BaseDialog.vue'
export default {
 extends: BaseDialog,
 props: {
 confirmText: { type: String, default: 'OK' },
 cancelText: { type: String, default: 'Cancel' }
 },
 template: `
 <BaseDialog v-bind="$props" v-on="$listeners">
 <template #default>
 <slot />
 </template>
 <template #footer>
 <button @click="close">{{ cancelText }}</button>
 <button @click="$emit('confirm')">{{ confirmText }}</button>
 </template>
 </BaseDialog>
 `,
 components: { BaseDialog }
}

لاحظ أن يستخدم كنموذج أولي (من خلال ) وكعنصر للطفل في النموذج، وهذا النمط يسمح لك بإضافة قدم مع أزرار بينما تعيد استخدام الإفراط في استخدام الهاتف الأساسي، والانتقال، والمنطق القريب.

Programmatic Cloning with (Vue 2) or (Vue 3)

بالنسبة للسيناريوهات الديناميه يمكنك استنساخ تعريف مكوني في وقت الهروب

import { defineComponent, h } from 'vue'
import BaseButton from './BaseButton.vue'

function createButtonVariant(customProps) {
 return defineComponent({
 extends: BaseButton,
 setup(props, { slots }) {
 // Override or extend behavior
 return () => h(BaseButton, { ...customProps, ...props }, slots)
 }
 })
}

وهذه التقنية مفيدة عند بناء سجل مكون يولد متغيرات تستند إلى الأجسام التشكيلية من نظام إدارة العلاقة أو نظام تقييم الأداء.

استخدام الطوابع للوسم

(اللوحات هي سمة أساسية من سمات (فوي التي تتوافق بشكل جميل مع النموذج الأولي، وبتعريفها للمواقف في عنصر القاعدة، يمكنك السماح للمستنسخين باستبدال أو زيادة أجزاء من وحدة التفتيش المشتركة دون إعادة كتابة المكوّن بأكمله، فالألواح المسماة تتيح نقاطاً متعددة للتكييف.

فعلى سبيل المثال، قد يكون لعنصر [ممثل]] فتحات لـ ، ، و. ويمكن أن يُستنسخ ] الرأس بلقب، وقطعة الديفور مع صورة ووصف، والقدم الذي له زر، ولكن البطاقات الأولية لا تزال دون تغيير.

ميكسينز، مكبرات، ومركبات: أيهما يستخدم؟

ويمكن تنفيذ النموذج الأولي للأنبات بمزيجات أو مدد أو مركب، وهنا يمكن المقارنة السريعة:

  • Mixins]: مفيد عندما تريد أن تتقاسم السلوك عبر عناصر متعددة غير متصلة، غير أن الخليط يمكن أن يؤدي إلى تصادم في السمات ومصدر غير واضح للممتلكات، فهي شكل من أشكال الاستنساخ الأولي، ولكن كثيرا ما تثبط لصالح المقارنات في Vue 3.
  • Extends]: Best for creating a direct parent-child component hierarchy. It is intuitive when you have a clear base prototype and a variant that inherits all options. The downside is that it creates tight coupling.
  • Composables]: النهج الأكثر مرونة، وهو يتيح لك استخراج المنطق في وظائف قابلة لإعادة الاستخدام يمكن أن تتألف من أي عنصر، ولا تخلق المركب سلسلة نموذجية، بل يُستخدم سلوكاً مستنسخاً عن طريق الاستفزاز الوظيفي، وكثيراً ما يُفضل ذلك في تطبيقات الفيديو الحديثة.

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

النموذج العالمي الحقيقي: بناء نظام إبلاغ قابل للإحالة

تخيلي أنكِ بحاجة إلى عرض الإخطارات في تطبيقك: النجاح، الخطأ، الإنذار، المعلومات، كل متغير يتشارك نفس التصميم (الرسالة، الزر المقرب) ولكن يختلف في اللون والييكون، وباستخدام النموذج الأولي، يمكنكِ إنشاء مكون ثم تستنسخيه لكل نوع.

  1. Define with props for , , and slots for icon. Include logical for auto-dismiss and animation.
  2. Create composable that manages a queue of notifications (similar to a prototype pool).
  3. Create individual notification components like that extends or composes with a green color scheme and a checkmark icon.
  4. تسجيل هذه المكونات على الصعيد العالمي أو استخدام عنصر دينامي يقوم على نوع معين.

الاستحقاق: تتقاسم جميع الإخطارات نفس المنطق، والانتقال، وخصائص الوصول، وتُحدِّث تلقائياً كل تغيير في عنصر القاعدة (مثل إضافة الانحراف إلى الرفض).

استحقاقات الحد من أنماط السلوك

Benefits:]

  • Code reuse]: Reduces duplication across UI elements.
  • Consistency]: جميع المستنسخين يتقاسمون نفس سلوك القاعدة وأسلوبها، بما يكفل وجود تجربة موحدة للمستعملين.
  • Ease of maintenance]: A single change to the prototype propagates to all descendants (if using inheritance) or can be propagated via composables.
  • Rapid development]: يمكن إنشاء متغيرات جديدة باستنساخ عنصر قائم وإجراء تغييرات ضرورية فقط.
  • testingability]: تشمل الاختبارات الأولية للقاعدة التشغيل المشترك؛ ولا يلزم كتابة سوى اختبارات متغيرة محددة.

ترهيب: ]

  • Overhead of cloning]: في JavaScript, cloning objects can be shall be shallow or deep.
  • Tight coupling in inheritance: وباستخدام يمكن أن يجعل المتغيرات هشة إذا غير عنصر الأساس الهيكل الداخلي ويجب تصميم عنصر الأساس بعناية لدعم نقاط التمديد.
  • Compplexity in deep hierarchies]: Multiple levels of inheritance can become hard to reason about. Prefer composition over inheritance where possible.
  • Potential for duplication in templates]: إذا كان المستنسخون بحاجة إلى تجاوز أجزاء كبيرة من النموذج، فإنكم قد ينتهي بكم المطاف بنسخ النموذج بأكمله بدلاً من ورثته، وباستخدام فترات زمنية تخفف من هذا.

مقارنة مع نمط المصنع

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

أفضل الممارسات لاستخدام النموذج الأولي في Vue

  • Design prototypes with extension in mind]: Use props, slots, and events liberally. Avoid hardcoding class names or inline fashions that cannot be overridden.
  • Prefer composables over mixins] in Vue 3. They provide explicit dependencies and avoid naming collisions.
  • ترهيب عمق الإرث ]: لا أكثر من مستويين أو ثلاثة مستويات، وتصبح السلاسل العميقة صعبة المنال.
  • Document the prototype interface: clearly state which props, slots, and methods are intended to be overridden. This helps other developers create consistent clones.
  • Use TypeScript]: Defining interfaces for component options and props makes cloning safe and more predictable.
  • تجنب حالات عنصر الاستنساخ في وقت العمل إذا كان بإمكانك استخدام تعاريف المكونات الثابتة.
  • ] Test the prototype independently]. Then test each variant only for its customizations.

Advanced: Programmatic component Cloning with

في (فيو 3) يمكنك إنشاء مصنع يعيد تعريفاً جديداً للعنصر بإستنساخ قاعدة وتطبيق تجاوزات، وهذا مفيد لإنشاء مكتبات قابلة للتشكيل العالي تستخدم في مشاريع مختلفة ذات نظم تصميم مختلفة.

import { defineComponent, h } from 'vue'

function createClonedComponent(base, overrides = {}) {
 return defineComponent({
 name: overrides.name || `Cloned${base.name}`,
 extends: base,
 setup(props, { slots, emit }) {
 // Apply overrides logic
 const merged = { ...base.setup?.(props, { slots, emit }), ...overrides.setup?.(props, { slots, emit }) }
 return merged
 }
 })
}

const SuccessNotification = createClonedComponent(BaseNotification, {
 name: 'SuccessNotification',
 setup() {
 // Add success-specific logic
 const icon = 'check-circle'
 return { icon }
 }
})

هذا النهج يسمح لك بتوليد مجموعة كاملة من ملفات النماذج الأولية والتشكيلات

خاتمة

"النموذج الأولي هو أداة قوية في ترسانة "فوي جي مطورة "مكّن من إيجاد عناصر قابلة لإعادة الاستخدام متسقة ومستمرة وسهلة التمديد، بفهم كيفية استخدام المكونات المستنسخة عبر "مخططات "في تي:42" أو المزجات أو المركبات، وبتصميم مكونات أساسية ذات فتحات ودعائم، يمكنك بناء عنصر مرن من المكتبة لا تتكيف مع تغير المتطلبات

For further reading, explore Vue.js Composition API documentation] and ]Patterns.dev: Prototype Pattern. Also, check out discussions on Vue.extend vs mixins