سؤال

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

هل هو "طريق روبي" للكتابة بشكل صريح return في الأساليب؟لقد رأيت ذلك مع وبدون، ولكن هل هناك طريقة صحيحة للقيام بذلك؟هل ربما هناك حق وقت للقيام بذلك؟على سبيل المثال:

def some_func(arg1, arg2, etc)
  # Do some stuff...
  return value # <-- Is the 'return' needed here?
end
هل كانت مفيدة؟

المحلول

والقديم (و"أجاب") السؤال، ولكنني سوف إرم في بلدي اثنين سنتا كإجابة.

وTL؛ DR - لم يكن لديك، ولكن يمكن أن يجعل الشفرة الكثير أكثر وضوحا في بعض الحالات

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

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

def plus_one_to_y(x)
    @y = x + 1
end

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

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

def plus_one_to_y(x)
    @y = x + 1
    puts "In plus_one_to_y"
end

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

والسؤال الحقيقي الآن هو: لم تتوقع أي شيء حقا القيمة التي تم إرجاعها؟ هل هذا كسر شيء أم لا؟ هل كسر شيء في المستقبل؟ من تعرف! فقط مراجعة التعليمات البرمجية الكامل لجميع المكالمات سوف تتيح لك معرفة.

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

وحتى في حالة لدينا وظيفة عرض قليلا، على افتراض أردنا ذلك لإرجاع قيمة، فإنه يكتب مثل هذا ...

def plus_one_to_y(x)
    @y = x + 1
    puts "In plus_one_to_y"
    return @y
end

وسيكون واضحا جدا أن أي مبرمج أنه لا ترجع قيمة، وأصعب بكثير بالنسبة لهم لكسرها دون أن يدركوا ذلك.

وبدلا من ذلك، يمكن للمرء أن يكتب لها مثل هذا ويستبعد البيان عودة ...

def plus_one_to_y(x)
    @y = x + 1
    puts "In plus_one_to_y"
    @y
end

ولكن لماذا تهتم تاركة كلمة العودة؟ لماذا لا مجرد وضعها في هناك وجعلها 100٪ واضح ما الذي يحدث؟ وسوف يكون حرفيا أي تأثير على قدرة التعليمات البرمجية على أداء.

نصائح أخرى

ولا. أن أسلوب روبي جيد عموما فقط استخدام لعوائد واضحة ل<م> العودة المبكرة . روبي هي كبيرة على كود بساطتها / سحر الضمني.

وقال إنه إذا عودة صريحة من شأنه أن يجعل الأمور أكثر وضوحا، أو أسهل للقراءة، فإنه لن يضر أي شيء.

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

وأنا استخدم نفس التمييز عند <م> داعيا الطرق: طرق وظيفية الحصول على أقواس، وأساليب إجرائية لا

وأخيرا وليس آخرا، أود أيضا أن استخدام هذا التمييز مع كتل: القطع الفنية الحصول على الأقواس المعقوفة، وكتل الإجرائية (أي الكتل التي "لا" شيء) الحصول على do / end

ولكن، أحاول أن لا يكون متدينا حول هذا الموضوع: مع كتل، الأقواس المعقوفة وdo / end لها أسبقية مختلفة، وبدلا من إضافة أقواس واضحة لإزالة الغموض في التعبير، وأنا مجرد تحول إلى نمط آخر. الشيء نفسه ينطبق على أسلوب الدعوة: إذا ما أضيف أقواس حول قائمة المعلمة يجعل رمز أكثر قابلية للقراءة، أفعل ذلك، حتى لو كان الأسلوب في السؤال هو إجرائي في الطبيعة

في الواقع الشيء المهم هو التمييز بين:

  1. الوظائف - الطرق التي يتم تنفيذها لقيمة الإرجاع الخاصة بها
  2. الإجراءات - الطرق التي يتم تنفيذها لآثارها الجانبية

ليس لدى روبي طريقة أصلية لتمييزها - مما يجعلك عرضة لكتابة الإجراء side_effect() ومطور آخر يقرر إساءة استخدام قيمة الإرجاع الضمنية للإجراء الخاص بك (يتعامل معها بشكل أساسي على أنها وظيفة غير نقية).

لحل هذه المشكلة، خذ ورقة من كتاب سكالا وهاسكل واحصل على إجراءات العودة صراحة nil (الملقب ب Unit أو () بلغات أخرى).

إذا اتبعت هذا، ثم استخدام صريح return بناء الجملة أم لا يصبح مجرد مسألة أسلوب شخصي.

لمزيد من التمييز بين الوظائف والإجراءات:

  1. انسخ فكرة Jörg W Mittag الرائعة لكتابة الكتل الوظيفية باستخدام الأقواس المتعرجة، والكتل الإجرائية باستخدام do/end
  2. عند استدعاء الإجراءات، استخدم (), ، بينما عند استدعاء الوظائف، لا تفعل ذلك

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

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


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

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

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

من ناحية أخرى، في روبي من الأفضل الالتزام بالطرق أقل من 10 أسطر طويلة.ونظراً لهذا، فقد يتساءل المرء لماذا يتعين عليه أن يكتب المزيد من البيانات بنسبة 10% تقريباً، في حين أنها ضمنية بشكل واضح.


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

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

وهو يفعل.

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

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

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

def some_func_which_returns_a_list( x, y, z)
  return nil if failed_some_early_check


  # function code 

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