سؤال

وزميل لي ولقد تم مناقشة كيفية تعريف المتغيرات في وظيفة.

ودعونا نقول لديك فئة تسمى TStrings (باستخدام دلفي من أجل تفسير) الذي يحتوي على طريقة مجردة واحد على الأقل، وفئة سليل دعا TStringList الذي ينفذ من الواضح أن طريقة مجردة، لكنه يقدم أي شيء آخر تحتاج ليست نفذت بالفعل في السلف، وكيف تقوم بتعريف متغير وظيفة من نوع TStringList؟

وهنا مثالين. الذي يعتبر ممارسة أفضل ولماذا؟

procedure AddElements;
var
  aList: TStringList;
begin
  aList := TStringList.Create;
  try
    aList.Add('Apple');
    aList.Add('Pear');
  finally
    aList.free;
  end;
end;

procedure AddElementsII;
var
  aList: TStrings;
begin
  aList := TStringList.Create;
  try
    aList.Add('Apple');
    aList.Add('Pear');
  finally
    aList.free;
  end;
end;
هل كانت مفيدة؟

المحلول

وإنها TStringList، لذلك يجب عليك أيضا نعلن بأنها TStringList (المثال الأول). كل شيء آخر يمكن أن تخلط لك أو غيرهم أن قراءة رمز لاحقا.

نصائح أخرى

وتصويتي هو الشكل الثاني - والفكرة هي ان TStrings يحدد عقد / واجهة وعلى نحو أفضل لرمز لهم

.

وانا اقول ان ذلك يعتمد على ما إذا كنت تتوقع إذا قد غيرت TStringList إلى شيء آخر أن تنفذ TStrings أم لا. إذا كنت لا تتوقع أن تتغير، استخدام TStringList والوصول إلى الميزات الخاصة التي هي في TStringList وحدها (أعتقد أن هذا ليس هو الحال). إذا كنت تتوقع أنه قد تغيير نعلن بأنها TStrings والتمسك الطرق "آمنة".

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

وأنا أتفق مع Schnaader.

وTStringList لديه المزيد من الخصائص والأساليب التي TStrings (وهي فئة مجردة). باستخدام متغير TStrings يحظر استخدام هؤلاء الأعضاء unles كنت تستخدم القوالب. ولكن هذا هو جعل الأمور أسوأ في رأيي.

ويمكنك استخدام TStrings في حجة وظيفة.

procedure TMyClass.MyMethod(const AList: TStrings);
begin
end;

وأو كخاصية. ولكن المتغيرات والمجالات المحلية هي أكثر تنوعا إذا كانت decalared نوع الحقيقي.

وهذا يعتمد ...

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

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

Collection list = new ArrayList();
[loop] list.add(someItem); [end loop]

وغيرها.
لماذا ا؟ لأنها تتيح لتغيير التنفيذ (من التفصيل في بعض الحالات: بعض التطبيقات أكثر ملاءمة لبعض الأعراف (طابور، قائمة مرتبطة، كومة ...) لذلك قد يكون في الغالب القلق سرعة / الذاكرة) عن طريق التقليل من أثر التغيير.

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

وهناك ميزة أخرى: عندما يكون وسيلة يتوقع معلمة جمع ويمكن أن تعمل على مجموعة واسعة من المدخلات طالما أنه يحتاج إلى استخدام أساليب فقط عام

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top