البرمجة العامة - الاتصال غير طريقة الفراغ ولكن ليس باستخدام القيمة

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

سؤال

هذا هو البرمجة العامة ، ولكن إذا كان هذا يحدث فرقا, أنا باستخدام الهدف-c.أعتقد أن هناك طريقة إرجاع القيمة ، ويؤدي أيضا بعض الإجراءات ، ولكن كنت لا تهتم حول قيمة العوائد ، فقط الأشياء التي يفعل.هلا استدعاء الأسلوب كما لو كان الفراغ ؟ أو وضع النتيجة في متغير ومن ثم حذفها أو نسيان ذلك ؟ الدولة رأيك ، ماذا كنت ستفعل لو كان لديك هذه الحالة.

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

المحلول

ومن الأمثلة الشائعة على ذلك هو printf، والتي ترجع عدد صحيح ... ولكن نادرا ما تشاهد هذه:

int val = printf("Hello World");

نصائح أخرى

ونعم مجرد استدعاء الأسلوب كما لو كان باطلا. وربما كنت تفعل ذلك في كل وقت دون أن يلاحظ ذلك. عامل التعيين '=' فعلا بإرجاع قيمة، لكنها نادرا ما يتم استخدامه.

وهذا يعتمد على البيئة (اللغة، والأدوات، والمعيار الترميز، ...).

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

وأحيانا لا تستخدم قيمة يؤدي إلى التحذير، وهو غير مرغوب فيه. تعيين القيمة إلى متغير ثم لا تستخدم ذلك سيكون سببا مجرد تحذير آخر حول متغير غير المستخدمة. لهذه الحالة والحل هو أن يلقي النتيجة إلى الفراغ الذي التقديم المكالمة مع (الفراغ)، منها مثلا.

(void) my_function_returning_a_value_i_want_to_ignore().

هناك قضيتان منفصلتان هنا, في الواقع:

  1. يجب أن تهتم عاد القيمة ؟
  2. يجب عليك تعيين إلى متغير لن تستخدم ؟

الجواب رقم 2 هو "لا" مدوية - ما لم يكن بالطبع كنت تعمل مع اللغة حيث أن ذلك سيكون غير قانوني (في وقت مبكر توربو باسكال يتبادر إلى الذهن).هناك على الإطلاق أي نقطة في تعريف متغير فقط رمي بعيدا.

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

إذا هذا أمر شائع في صافي (على سبيل المثال)، هناك على الارجح مشكلة مع رمز كسر <لأ href = "http://en.wikipedia.org/wiki/Command-query_separation" يختلط = "نوفولو noreferrer" > CQS .

عند أدعو دالة تقوم بإرجاع قيمة I تجاهل، انها عادة ما تكون بسبب أنا أفعل ذلك في اختبار للتحقق من السلوك. وإليك مثالا في C #:

    [Fact]
    public void StatService_should_call_StatValueRepository_for_GetPercentageValues()
    {
        var statValueRepository = new Mock<IStatValueRepository>();

        new StatService(null, statValueRepository.Object).GetValuesOf<PercentageStatValue>();

        statValueRepository.Verify(x => x.GetStatValues());
    }

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

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

<اقتباس فقرة>   

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

     int fn () __attribute__ ((warn_unused_result));
     int foo ()
     {
       if (fn () < 0) return -1;
       fn ();
       return 0;
     }
     

والنتائج في تحذير على خط 5.

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

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