سؤال

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

ما هو أفضل حل؟ لخفض قيمة في واضع منها مثلا.

public void setString(String string) {
    this.string = string.trim();
}

وأو تقليم في المتصل (أكثر من مرة) منها مثلا.

object.setString(string.trim());

وأو ربما شيء آخر؟

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

المحلول

نعم. بعد كل شيء، وقد صممت اضعي لهذا النوع من الأشياء! لمراقبة وتطهير القيم مكتوبة إلى الميادين؛)

نصائح أخرى

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

public double UserTemperature
{
  get
  {
    return Units.Instance.ConvertFromSystem(UnitType.Temperature, temperature);
  }
  set  
  {
    double v = Units.Instance.ConvertToSystem(UnitType.Temperature, value);
    if (temperature != v)
    {
      temperature = v;
      Changed("SystemTemperature");
      Changed("UserTemperature");
    }
  }
}

نعم، بالتأكيد. فقط كن حذرا للتحقق من NULL قبل تطبيق أي أسلوب (مثل تقليم ()).

وهناك مدرستان: واحدة تقول ان موافق للتحقق المعلمة في اضع (أسلوب المدرسة)، والثاني أحد يقول أن حبوب لا تحتوي على أي منطق والبيانات فقط (نمط المؤسسة)

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

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

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

وو(أفضل؟) البديل الآخر هو تغيير اسم الأسلوب لtrimAndSetString. وبهذه الطريقة، فإنه ليس من المستغرب أن التصرفات تقليم الإدخال.

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

وهذا هو بالضبط السبب الذي تستخدمه اضعي بدلا من تعريض حقول الكائنات إلى العالم بأسره.

والنظر في الطبقة التي تحمل زاوية صحيح أن من المتوقع أن يكون بين 0 و 359 ضمنا.

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

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

actualVal = passedValue % 360;

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

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

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

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

إذا واحد رغبات تسمح عميل لتعديل حالة الكائن في بعض الأزياء التي لا تستوفي الوصف أعلاه، ينبغي للمرء أن استخدام أسلوب بدلا من الملكية. إذا Foo.SetAngle(500) واحد المكالمات سيكون من المعقول توقع أن الطريقة سوف تستخدم المعلمة المشار إليها في وضع زاوية، لكن الخاصية Angle قد لا تعود زاوية في نفس شكل تأسيسه (على سبيل المثال، فإنه قد يعود 140). من ناحية أخرى، إذا Angle هو خاصية للقراءة والكتابة، يتوقع المرء أن كتابة قيمة 500 إما تكون ممنوعة أو آخر من شأنها أن تسبب القيمة إلى قراءة مرة أخرى 500. إذا كان أحد يريد أن يكون مخزن الكائن زاوية في النطاق من 0 إلى 359، يمكن للكائن أيضا أن يكون لها خاصية للقراءة فقط يسمى BaseAngle التي سوف دائما العودة زاوية في هذا النموذج.

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