বৈধ স্থিতি বজায় রাখার জন্য, অর্থাৎ, অবজেক্টের ডেটা সদস্যদের আপডেট করার জন্য কোনও শ্রেণিতে একটি বড় প্রাইভেট ফাংশন সংজ্ঞায়িত করা কি ভাল ধারণা?


18

যদিও নীচের কোডে একটি ই-বাণিজ্য সাইটের একটি সাধারণ একক আইটেম ক্রয় ব্যবহৃত হয়, আমার সাধারণ প্রশ্নটি কোনও অবজেক্টের ডেটা সর্বদা বৈধ অবস্থায় রাখতে সমস্ত ডেটা সদস্যদের আপডেট করার বিষয়ে।

এখানে প্রাসঙ্গিক বাক্যাংশ হিসাবে আমি "ধারাবাহিকতা" এবং "রাষ্ট্রই খারাপ is" দেখতে পেয়েছি, এখানে আলোচনা করা হয়েছে: https://en.wikibooks.org/wiki/Object_Oriected_Programming#.22 স্টেট ২২_আইস_ভিল .২১

<?php

class CartItem {
  private $price = 0;
  private $shipping = 5; // default
  private $tax = 0;
  private $taxPC = 5; // fixed
  private $totalCost = 0;

  /* private function to update all relevant data members */
  private function updateAllDataMembers() {
    $this->tax =  $this->taxPC * 0.01 * $this->price;
    $this->totalCost = $this->price + $this->shipping + $this->tax;
  }

  public function setPrice($price) {
      $this->price = $price;
      $this->updateAllDataMembers(); /* data is now in valid state */
  }

  public function setShipping($shipping) {
    $this->shipping = $shipping;
    $this->updateAllDataMembers(); /* call this in every setter */
  }

  public function getPrice() {
    return $this->price;
  }
  public function getTaxAmt() {
    return $this->tax;
  }
  public function getShipping() {
    return $this->shipping;
  }
  public function getTotalCost() {
    return $this->totalCost;
  }
}
$i = new CartItem();
$i->setPrice(100);
$i->setShipping(20);
echo "Price = ".$i->getPrice(). 
  "<br>Shipping = ".$i->getShipping().
  "<br>Tax = ".$i->getTaxAmt().
  "<br>Total Cost = ".$i->getTotalCost();

কোনও অসুবিধা, বা এটি করার আরও ভাল উপায়?

এটি রিয়েল রিয়েল ওয়ার্ল্ড অ্যাপ্লিকেশনগুলিতে একটি রিটার্নাল ইস্যু যা কোনও রিলেশনাল ডেটাবেস দ্বারা সমর্থিত, এবং যদি আপনি ডাটাবেসে সমস্ত বৈধতা ঠেকানোর জন্য সঞ্চিত পদ্ধতিগুলি ব্যাপকভাবে ব্যবহার না করেন। আমি মনে করি যে ডেটা স্টোরটি কেবল ডেটা সঞ্চয় করা উচিত, যখন কোডটি রান-টাইম স্টেটটি বজায় রাখার কাজটি করে।

সম্পাদনা: এটি সম্পর্কিত প্রশ্ন তবে বৈধ রাষ্ট্র বজায় রাখতে একটি বৃহত্ ফাংশন সম্পর্কিত সেরা অনুশীলনের সুপারিশ নেই: /programming/1122346/c-Sharp-object-oriented-design-maintaining- বৈধ-বস্তুর রাষ্ট্রবিরোধী

সম্পাদনা 2: যদিও @ ইগনিশিপের উত্তরটি সেরা, তবে এই উত্তরটি - /software//a/148109/208591 - যা হ'ল @ আইজেনশিপের উত্তর এবং আমি যা জানতে চেয়েছিলাম তার মধ্যে লাইনগুলি পূরণ করে - কোড কেবল প্রক্রিয়া করা উচিত, এবং বিশ্বব্যাপী রাষ্ট্রের সাথে ডিআই-সক্ষম রাষ্ট্রের অবজেক্টগুলির মধ্যে স্থান পরিবর্তন করতে হবে।


আমি ভেরিয়েবলগুলি শতাংশের এড়িয়ে চলি। আপনি ব্যবহারকারীর কাছ থেকে শতাংশ গ্রহণ করতে পারেন, বা কোনও ব্যবহারকারীর কাছে প্রদর্শন করতে পারেন, তবে প্রোগ্রামের ভেরিয়েবল অনুপাত হলে জীবন আরও ভাল better
কেভিন cline

উত্তর:


29

সমস্ত কিছু সমান হওয়ায় আপনার আক্রমণকারীদের কোডে প্রকাশ করা উচিত। এই ক্ষেত্রে আপনার কাছে আক্রমণকারী রয়েছে

$this->tax =  $this->taxPC * 0.01 * $this->price;

আপনার কোডে এটি প্রকাশ করতে, ট্যাক্স সদস্য ভেরিয়েবলটি সরান এবং এর সাথে getTaxAmt () প্রতিস্থাপন করুন

public function getTaxAmt() {
  return $this->taxPC * 0.01 * $this->price;
}

মোট ব্যয়ের সদস্যের পরিবর্তনশীল থেকে মুক্তি পেতে আপনার অনুরূপ কিছু করা উচিত।

আপনার কোডে আপনার আক্রমণকারীদের প্রকাশ করা বাগগুলি এড়াতে সহায়তা করতে পারে। আসল কোডে, সেটপ্রাইস বা সেট শিপিং কল করার আগে মোট ব্যয়টি ভুল হয়।


3
অনেক ভাষার গিটার রয়েছে যাতে এই জাতীয় ফাংশনগুলি সেগুলি সম্পত্তি হিসাবে ভান করে। দুজনের সেরা!
কৌতূহলীনি

দুর্দান্ত পয়েন্ট, তবে আমার সাধারণ ব্যবহারের ক্ষেত্রে হ'ল কোডটি রিলেশনাল ডাটাবেসে একাধিক সারণীতে একাধিক কলামে ডেটা আনে এবং সংরক্ষণ করে (মাইএসকিউএল বেশিরভাগ) এবং আমি সঞ্চিত পদ্ধতিগুলি (বিতর্কযোগ্য এবং তার নিজস্ব কোনও বিষয়) ব্যবহার করতে চাই না। আপনার আক্রমণকারীদের ইন-কোড ধারণাটি আরও গ্রহণ করার অর্থ এর অর্থ হল যে সমস্ত গণনা অবশ্যই "শৃঙ্খলিত" হওয়া উচিত: getTotalCost()কল getTaxAmt()এবং আরও অনেক কিছু। এর অর্থ আমরা কেবল কখনই অ-গণনা করা জিনিস সঞ্চয় করি । আমরা কি ক্রিয়ামূলক প্রোগ্রামিংয়ের দিকে কিছুটা এগিয়ে যাচ্ছি? এটি দ্রুত অ্যাক্সেসের জন্য টেবিলগুলিতে গণনা করা সত্তাগুলির সঞ্চয়কেও জটিল করে তোলে ... পরীক্ষার প্রয়োজন!
80443

13

কোনও অসুবিধা [?]

অবশ্যই। এই পদ্ধতিটি সর্বদা কিছু করার জন্য মনে রাখার উপর নির্ভর করে । প্রত্যেকের উপর নির্ভর করে যে কোনও পদ্ধতি এবং সবসময় কখনও কখনও ব্যর্থ হতে বাধ্য

সম্ভবত এটি করার আরও ভাল উপায়?

অনুষ্ঠানের কথা মনে রাখার বোঝা এড়ানোর একটি উপায় হ'ল @Eegensheep এর পরামর্শ অনুসারে প্রয়োজনীয় সামগ্রীর উপর নির্ভর করে এমন বস্তুর বৈশিষ্ট্য গণনা করা।

অন্যটি কার্ট আইটেমটিকে অপরিবর্তনীয় করে তুলছে এবং এটি নির্মাণকারী / ফ্যাক্টরি পদ্ধতিতে গণনা করছে। আপনি সাধারণভাবে "প্রয়োজনীয় হিসাবে গণনা করুন" পদ্ধতিটি নিয়ে যান, এমনকি যদি আপনি অবজেক্টটিকে অনিবার্য করে তোলেন। তবে যদি গণনা খুব বেশি সময়সাপেক্ষ হয় এবং অনেকগুলি, বহুবার পড়তে হবে; আপনি "সৃষ্টির সময় গণনা করুন" বিকল্পটি বেছে নিতে পারেন।

$i = new CartItem();
$i->setPrice(100);
$i->setShipping(20);

আপনার নিজের জিজ্ঞাসা করা উচিত; দাম ছাড়াই কোনও কার্ট আইটেমটি কী বোঝায়? কোনও আইটেমের দাম কি পরিবর্তন হতে পারে? এটি তৈরির পরে? তার ট্যাক্স গণনার পরে? ইত্যাদি হতে পারে আপনার CartItemকনস্ট্রাক্টরে অপরিবর্তনীয় এবং অ্যাসিগ দাম এবং শিপিং করা উচিত :

$i = new CartItem(100, 20);

কোনও কার্টের আইটেমটি কার্টের অন্তর্ভুক্ত ছাড়া কী বোঝা যায়?

যদি না হয়, আমি $cart->addItem(100, 20)পরিবর্তে আশা করব ।


3
আপনি সবচেয়ে বড় অসুবিধাটি উল্লেখ করেছেন: লোকেরা যে জিনিসগুলি করতে মনে রাখে তাদের উপর নির্ভর করা খুব ভাল সমাধান খুব কমই। আপনি কেবলমাত্র কোনও কিছুর উপর নির্ভর করতে পারেন তা হ'ল তারা কিছু করতে ভুলে যাবে।
কর্সিকা

@ কর্সক্লাউস হো হো হো এবং আবুজিতিন, শক্ত পয়েন্ট, এর সাথে তর্ক করতে পারে না - মানুষ সর্বদা ভুলে যায় । তবে উপরে আমি যে কোডটি লিখেছি তা হ'ল একটি উদাহরণ, এখানে ব্যবহারের যথেষ্ট ঘটনা রয়েছে যেখানে কিছু ডেটা সদস্য পরে আপডেট হয়। অন্য যেভাবে আমি দেখতে পাচ্ছি তা আরও স্বাভাবিক করা - এমন ক্লাস তৈরি করুন যাতে স্বতন্ত্রভাবে আপডেট হওয়া ডেটা সদস্যরা অন্য শ্রেণিতে থাকে এবং আপডেটের দায়কে কিছু ইন্টারফেসের দিকে ঠেলে দেয় - যাতে অন্যান্য প্রোগ্রামাররা (এবং কিছুক্ষণ পরে নিজেকে) একটি পদ্ধতি লিখতে হয় - সংকলক আপনাকে এটি লিখতে হবে তা মনে করিয়ে দেয়। তবে এতে আরও অনেক ক্লাস যুক্ত হবে ...
80443

1
@ সাইট80443 আমি যা দেখছি তার ভিত্তিতে, এটিই ভুল পদ্ধতির। আপনার ডেটা যেমন মডেল করার চেষ্টা করুন যে কেবলমাত্র তার বিরুদ্ধে বৈধতাযুক্ত ডেটা অন্তর্ভুক্ত থাকে। উদাহরণস্বরূপ কোনও আইটেমের দাম নেতিবাচক হতে পারে না শুধুমাত্র নিজের উপর নির্ভর করে। যদি কোনও আইটেমটি ছাড় দেওয়া হয়, তবে দামটিকে ছাড়টি ফ্যাক্টর করবেন না - পরে ছাড় দিয়ে সজ্জিত করুন। আইটেমটির জন্য 99 4.99 এবং পৃথক সত্তা হিসাবে 20% ছাড় এবং অন্য সত্তা হিসাবে 5% কর সংরক্ষণ করুন। উদাহরণস্বরূপ যদি আপনার প্রকৃত লাইফ কোডটি উপস্থাপন করে তবে আপনার ডেকোরেটার প্যাটার্নটি বিবেচনা করা উচিত বলে মনে হচ্ছে এটির মতো।
corsiKa
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.