هل تعني الكتابة الثابتة أنه يتعين عليك إرسال متغير إذا كنت تريد تغيير نوعه؟

StackOverflow https://stackoverflow.com/questions/600126

سؤال

هل هناك أي طرق أخرى لتغيير نوع المتغير في لغة مكتوبة بشكل ثابت مثل Java وC++، باستثناء "casting"؟

أحاول معرفة الفرق الرئيسي من الناحية العملية بين الكتابة الديناميكية والثابتة ومواصلة البحث عن تعريفات أكاديمية للغاية.أتساءل ماذا يعني ذلك فيما يتعلق بالشكل الذي يبدو عليه الكود الخاص بي.

هل كانت مفيدة؟

المحلول

تأكد من أنك لا تحصل على ثابت مقابل.يتم الخلط بين الكتابة الديناميكية والكتابة القوية مقابل الكتابة الديناميكية.كتابة ضعيفة.

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

يمكن الجمع بين هذين النقيضين بحرية:

  • تتم كتابة Java بشكل ثابت وقوي
  • تتم كتابة لغة C بشكل ثابت وضعيف (حسابات المؤشر!)
  • يتم كتابة روبي بشكل ديناميكي وقوي
  • تتم كتابة جافا سكريبت بشكل ديناميكي وضعيف

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

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

نصائح أخرى

في C++/Java لا يمكنك تغيير نوع المتغير.

الكتابة الثابتة:يحتوي المتغير على نوع واحد مخصص في نوع الترجمة ولا يتغير.

الكتابة الديناميكية:يمكن أن يتغير نوع المتغير أثناء وقت التشغيل، على سبيل المثال.في جافا سكريبت:

js> x="5" <-- String
5
js> x=x*5 <-- Int
25

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

أتساءل ماذا يعني ذلك فيما يتعلق بالشكل الذي يبدو عليه الكود الخاص بي.

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

لم تكن يحتاج صب صريح.في كثير من الحالات صب ضمني يعمل.

على سبيل المثال:

int i = 42;
float f = i; // f ~= 42.0
int b = f;   // i == 42

class Base {
};

class Subclass : public Base {
};

Subclass *subclass = new Subclass();
Base *base = subclass;  // Legal

Subclass *s = dynamic_cast<Subclass *>(base); // == subclass.  Performs type checking.  If base isn't a Subclass, NULL is returned instead.  (This is type-safe explicit casting.)

ومع ذلك، لا يمكنك تغيير نوع المتغير.يمكنك استخدام النقابات في C++ لتحقيق نوع من الكتابة الديناميكية.

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

بالنسبة للتحويلات، هناك الكثير من الأساليب مثل toInteger وtoFloat في Java لإجراء تحويل وإنشاء كائن من نوع جديد له نفس القيمة النسبية.توجد أيضًا في JavaScript طرق تحويل، ولكنها تولد كائنات جديدة أيضًا.

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

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

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

Dim id
id = Request.QueryString("id") ' this variable is now a string
If id = "42" Then
  id = 142 ' sometimes turned into a number
End If
If id > 100 Then ' will not work properly for strings

باستخدام التدوين المجري، يمكنك اكتشاف الكود الذي يخلط الأنواع، مثل:

lngId = Request.QueryString("id") ' putting a string in a numeric variable

strId = 42 ' putting a number in a string variable
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top