forum.ge
reklama
FORUM.GE წესები  · დახმარება  · ძებნა  · წევრები  · კალენდარი  · ფოსტა  · ჩატი
  გამოხმაურება · ახალი თემა · ახალი გამოკითხვა

> Singlton-ი, inheritance Singlton-ის შექმნის ხელისშემშლელი?
shinauri
Super Member


****
ჯგუფი: Registered
წერილები: 464
წევრი No.: 68310
რეგისტრ.: 27-July 08

გამოგზავნილია: 2 Jun 2014, 12:03  #41144123      · პროფილი · პირადი მიმოწერა · ჩატი · ელფოსტა
მოგესალმებით ყველას.
Web programing - ის განყოფილებაში გავხსენი ეს თემა , მაგრამ მერე გამახსენდა კომპეტენტური პასუხი სად შეიძლება მეპოვა და აქაც გავხსენი. თუ მოდერატორი მოევლინა ამ ფორუმს ვთხოვ იქ დახუროს ეს თემა.

ჩემის აზრით საინტერესო ფაქტს წავაწყდი და ამ ფაქტის თქვენთვის გაზიარებასთან ერთად იქნებ სოლუშენიც გამოჩნდეს ამ თემის განხილვის პროცესში.

არ ვიცი რა დავარქვა ამას Php-ს შემქმნელების წინდაუხედავობა, თუ OOP პარადიგმა ასეთ მკაცრ პრევენციებს მოითხოვს, რომ შვილობილი კლასის კონსტრუქორი აუცილებლად უნდა იყოს მშობლის კონსტრუქტორის ხედვის არიალის მსგავსი. ალბათ მხოლოდ ერთი შემთხვევაა როცა ასეთი მიდგომა ხელისშემშლელ ფაქტორად იქცევა და სწორედ ასეთ შემთხვევას მივადექი.

მაქვს კლასი User, რომელიც თავის მხირ ნაწარმოებია კლასს Person-ისგან და მაქვს კლასი
CODE

class Currentuser extends User{}
.


კლასი Currentuser მინდა რომ იყოს სინგლტონი მაგრამ ვინაიდან ის ნაწარმებია კლასს User -ისგან შეუძლებელი ხდება კონსტრუქტორის private-დ გამოცხადება, რამაც ძალიან გამაკვირვა. რათქმაუნდა ერთის მხრივ ლოგიკურია ეს შეზღუდვა, მაგრამ ამავდროულად ნულზე დადის მოქნილობა. ვიდაინად სხვა გამოსავალი ვერ მოვიფიქრე Currentuser კლასი მაქვს შემდეგ მდგომარეობაში :

CODE


class Currentuser extends User{
  private static $_instance;
  private static $classdirectcreationpreventing = false;
 
  public static function instance($username,$middlename,$lastname,$firstname,DateTime $birthdate = null,Interfaces_Sex $sex = null){
      if ( ! isset(Currentuser::$_instance))
      {
           //აქ მინდა გავამახვილო თქვენი ყურადღება
          Currentuser::$classdirectcreationpreventing = true;
          // Create a new user instance
          Currentuser::$_instance = new Currentuser($username,$middlename,$lastname,$firstname,$birthdate,$sex);
      }

      return Currentuser::$_instance;
  }
 
  public function __construct($username,$middlename,$lastname,$firstname,DateTime $birthdate = null,Interfaces_Sex $sex = null){
     //აქ მინდა გავამახვილო თქვენი ყურადღება
     if(!Currentuser::$classdirectcreationpreventing){
          throw new Exception("You can't create instance of Currentuser directtly only from Currentuser::instance() method");
      }
      Currentuser::$classdirectcreationpreventing = false;
      parent::__construct($username,$middlename,$lastname,$firstname,$birthdate,$sex);
  }
 
 
  private function __clone(){}
  private function __wakeup(){}
}



რამდენად სწორეა თქვენის აზრით ასეთი გადაწყვეტა და რათქმაუნდა სულით და გულით ველი უკეთესი გადაწყვეტის ვარიანტს.
sergo_bero
Super Crazy Member


******
ჯგუფი: Members
წერილები: 5265
წევრი No.: 7145
რეგისტრ.: 7-November 04

გამოგზავნილია: 2 Jun 2014, 13:28  #41144874      · პროფილი · პირადი მიმოწერა · ჩატი · ვებგვერდი
shinauri
ასეა , რადგანაც მშობელი კლასის რაიმე მეთოდი არის public მისი მემკვიდრე კლასის არ უნდა იყოს უფრო "ჩაკეტილი" , რადგანაც იგივე მეთოდების გამოძახება უნდა შეგეძლოს რაც მშობელზე ,

CODE
Currentuser::$classdirectcreationpreventing = true;

ეს აღარ გინდა , პირდაპირ შეამოწმე თუ გაქვს ინსტანსი , დააბრუნე , თუ არ გაქვს ახალი შექმენი და დააბრუნე , __construct-შიც შეამოწმე თუ გაქვს ინსტანსი უკვე exception ისროლე რომ instance მეთოდით მომმართეო

CODE


private static _instance;

function getInstance(...) {
if(!_instance) {
 _instance = ....
}
return _instance;
}

__construct(....) {
if(_instance) {
 throw ("Please use getInstance method");
}
}


This post has been edited by sergo_bero on 2 Jun 2014, 13:32


--------------------
https://ogres.ge/
shinauri
Super Member


****
ჯგუფი: Registered
წერილები: 464
წევრი No.: 68310
რეგისტრ.: 27-July 08

გამოგზავნილია: 2 Jun 2014, 13:41  #41145025      · პროფილი · პირადი მიმოწერა · ჩატი · ელფოსტა
ergo_bero მადლობ პასუხისთვის, ზუსტად ახლა ვფიქრობდი მაგაზე, რომ ინსთანსე შემემოწმებინა კონსტრუქტორშიც smile.gif და კარგია, რომ დამასწარი და დაასაბუთე ჩემი მოსაზრებები ამის თაობაზე.
Mazahacka
♤ ♡ ♢ ♧ ♠ ♥ ♦ ♣


*****
ჯგუფი: Members
წერილები: 4336
წევრი No.: 39044
რეგისტრ.: 28-July 07

გამოგზავნილია: 23 Aug 2014, 15:14  #42015638      · პროფილი · პირადი მიმოწერა · ჩატი · ელფოსტა
მიმაჩნია რომ პათერნი სინგლტონი სულაც არ არის შექმნილი იმისთვის, რომ მან თვისებები და ქცევები მიიღოს ზედა კლასებისგან, სინგლტონის დანიშნულებაა გვქონდეს გლობალური ობიექტი, რომლითან გვექნება წვდომა სხვა ობიექტებზე აპლიკაციის ნებისმიერ წერტილში, ანუ მარტივად რომ ავხსნა, სინგლტონის ოფშენებში გვაქ სხვა ობიექტები და უკვე მაგ ობიექტებიდან მივწვდებით რასაც გვინდა იმას, არ მესმის რა საჭიროა ამ არქიტექტურაში მემკვიდრეობა.
1 წევრი ათვალიერებს ამ თემას (1 სტუმარი და 0 უჩინარი წევრი)
0 წევრი:
Topic Options გამოხმაურება · ახალი თემა · ახალი გამოკითხვა

 



ფორუმის სერვერების განთავსებას და ინტერნეტთან კავშირს უზრუნველყოფს: CLOUD9
[ Script Execution time: 0.0161 ]   [ 12 queries used ]   [ GZIP Disabled ]