আমি কীভাবে একটি সরল, তবে বাস্তব-বিশ্ব, ওয়েব অ্যাপ তৈরির জন্য ওওপি ধারণাটি প্রয়োগ করতে পারি? [বন্ধ]


25

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

আমি বাক্য গঠন বা নির্দিষ্ট কোড লেখার জন্য সাহায্যের জন্য বলছি না - আমি ডকুমেন্টেশনে এবং ফোরাম ইত্যাদিতে অনুসন্ধান করে নিজেকে দেখতে পাচ্ছি I আমার যা প্রয়োজন তা হল কিছু দিকনির্দেশনা এবং এখন এবং পরে সঠিক পথে একটি ধাক্কা। এমন কোন পাকা প্রোগ্রামাররা কি আমাকে পরামর্শদানে রাজী?

আমার শেখার প্রকল্প হিসাবে আমি একটি সাধারণ শ্রেণিবদ্ধ "ওয়েব অ্যাপ্লিকেশন" তৈরি করতে চাই। ক্রেগলিস্টের মতো কিছু তবে সুযোগের শর্তে পানির নিচে। আমি পিএইচপি 5 এবং মাইএসকিউএল ব্যবহার করতে চাই, কারণ আমি তাদের সাথে পরিচিত।

ধরা যাক যে কেবলমাত্র এই 2 টি ব্যবহারের কেস রয়েছে:

  1. বিক্রয়ের জন্য কিছু পোস্ট করা হচ্ছে
  2. ব্রাউজিং / কেনার জন্য কিছু অনুসন্ধান করা

কোন "জিনিস" অবজেক্ট হওয়া উচিত? আমি কল্পনা করতে পারি যে প্রতিটি আইটেম একটি বস্তু হতে পারে, কিন্তু কোন পর্যায়ে? এবং কেন?

সুতরাং উদাহরণস্বরূপ, ব্যবহারকারীর "বিক্রির জন্য পোস্ট আইটেম" ফর্মটি পূরণ করে, সেই ফর্মটি কি এমন কোনও বস্তুতে পরিণত হওয়া উচিত যা কোনও অন্য অবজেক্টে পাস হয় যা মানগুলিকে একটি ডাটাবেসে সন্নিবেশ করে?

যখন অন্য ব্যবহারকারী ব্রাউজ করছেন এবং সি বিভাগের সমস্ত আইটেম দেখার অনুরোধ করবেন তখন কী হবে? এটিকে কী বোঝায় যে অ্যাপটিকে যখনই তার ডাটাবেসের সাথে সংযুক্ত করতে হবে তখন এটি একটি ডাটাবেস অবজেক্ট তৈরি করে এবং তারপরে আইটেমের একগুচ্ছ বস্তু পায় এবং সেগুলি পৃষ্ঠায় প্রদর্শন করে? … এটি লেখার ফলে অবশ্যই আমি উপলব্ধি করতে পারি যে আমি এখনও ওওপি সম্পর্কে কতটা নির্লিপ্ত। দয়া করে আমাকে এটি ঠিক করতে সহায়তা করুন।

আপনার মতে যদি ওওপি দিয়ে মোড়ক শুরু করা ভাল প্রকল্প না হয় তবে দয়া করে অন্য ধারণাটি নির্দ্বিধায় জানান!


1
আমি একই নৌকায় আছি, আমি মনে করি আমি ওওপি বুঝতে পেরেছি - জাভা চেষ্টা করার পরে অনেক সময় হয়েছে, কিন্তু যখন পিএইচপি করার বিষয়টি আসে তখন আমি জানতাম কীভাবে তাত্ক্ষণিকভাবে 'স্বাভাবিক' উপায়ে এই জিনিসগুলি করা যায় তবে যখন কীভাবে চিন্তা করা যায় এটি ওওপি ব্যবহার করে করা হবে আমি বেঁচে থাকার ইচ্ছা হারিয়ে ফেলছি।
martincarlin87

ফর্মটি কোনও বস্তুতে পরিণত হয় না। একটি বস্তু একটি শ্রেণীর উদাহরণ। আপনি এটি দেখতে পারেন। $ আইটেম-> সেভ আইটেম ($ _ পোস্ট ['নাম'],; _POST ['বিবরণ']); সম্পাদনা যা আমাকে সত্যই বুঝতে সাহায্য করেছে যে ওওপি একটি সাধারণ "গেস্টবুক" ওয়েব-অ্যাপ তৈরি করছে। ব্যবহারকারীদের লগ ইন করুন, বার্তা পোস্ট করুন, বার্তাগুলি সম্পাদনা করুন, বার্তাগুলি মুছুন এবং বার্তাগুলি সন্ধান করুন ইত্যাদি

@pduersteler ভাল ধারণা, আমি কীভাবে এটি করতে যাব? স্বীকারোক্তি হিসাবে, এটি স্ট্যাকওভারফ্লোতে আমার প্রথম প্রশ্ন :)

আপনারা যেমন বোনো সম্ভবত গেস্টবুক অ্যাপ্লিকেশন শুরু করার চেয়ে আরও ভাল জায়গা। অন্য যেটির বিষয়ে আমি ভাবছিলাম তা হ'ল একটি অতি সাধারণ তালিকা অ্যাপ্লিকেশন যেখানে ব্যবহারকারীরা সেই তালিকাগুলিতে লগইন, সম্পাদনা / তালিকা মুছুন, যুক্ত / সম্পাদনা / আইটেমগুলি মুছুন। আপনি কি আমাদের / আমার সাথে আপনার গেস্টবুক অ্যাপটি ভাগ করে নিতে আপত্তি করবেন?

আমি এটি ভাগ করে নিতে আপত্তি করবে না, যদিও এটি পোস্ট করা কোডের একটি লুুট হবে। আপনি চাইলে আমি আপনার সাথে একটি সাধারণ উদাহরণ শ্রেণি ভাগ করতে পারি। এছাড়াও আমি জানি না এই কোডটি কতটা ভালভাবে কাজ করবে, কারণ বেশ স্পষ্টভাবে কিছুক্ষণ হয়ে গেছে: পি আমি নীচে এটি পোস্ট করব

উত্তর:


17

আমি সত্যই মনে করি যে এখানের পরামর্শটি এখন পর্যন্ত নতুন ওও শিখার জন্য ভয়ানক। কিছু শ্রেণীর দ্বারা সংজ্ঞায়িত "জিনিস" এর নির্দিষ্ট উদাহরণের উপস্থাপনা হিসাবে অবিলম্বে অবজেক্টগুলির চিন্তাভাবনা শুরু করা ভাল ধারণা নয়। একে অপরের সাথে কিছুটা মিথস্ক্রিয়া রয়েছে এমন মেশিনের বগিযুক্ত উপাদান হিসাবে তাদের মনে করা ভাল তবে একে অপরের অভ্যন্তরীণ নয়। এই উপাদানগুলির প্রতিটি রাষ্ট্র বজায় রাখে

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

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

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

আমার চূড়ান্ত পরামর্শটি হ'ল: উত্তরাধিকারের উপরে রচনাটি হ'ল উপায়।


আমার আঙ্গুলের একটি নিয়ম, বিশেষত গতিশীল ভাষার জন্য, আমি যদি বহুবর্ষের সুবিধা নিতে চাই তবে কেবল শ্রেণি তৈরি করার চেষ্টা করা হয় (অর্থাৎ, যদি সেই শ্রেণিগুলি একই পদ্ধতির বিভিন্ন সংস্করণ প্রয়োগ করে, এবং যুক্তি তার উপর নির্ভর করে একরকম)। অন্যথায়, আমি এটিকে আরও সহজ রাখার জন্য আরও "পদ্ধতিগত" রচনাতে ভুল করার চেষ্টা করি।
hugomg

9

আপনার পোষা প্রাণী কিনতে এবং বিক্রি করতে আপনি কীভাবে ওওপি ব্যবহার করতে পারেন তা এখানে, একই পদ্ধতিটি গাড়ি বা প্লেন বিক্রি করার জন্য ব্যবহার করা যেতে পারে; পি

<?php
// define a superclass .. no instances will be made of 'animal' itself,
// but it is useful to define common characteristics and behaviours
// (ie: properties and methods) of all our classes of animals
class Animal {

    // this constructor function is called whenever a new instance
    // of the Animal class is created (or any class that inherits from Animal)
    function Animal ($colour) {

        // install the argument as an attribute of any instances of Animal
        $this->colour = $colour;
    }

    // this method will be available to all classes that inherit from Animal
    function report () {
        return "This ".$this->colour." ".get_class($this)." has ".$this->legs." legs.<br />";
    }
}

// this class inherits from Animal
class Cat extends Animal {

    // set the legs attribute
    public $legs = 4;

    // create a method that can be called from any instances of Cat
    function make_noise () {
        echo "MEOW!<br />";
    }
}

// this class inherits from Cat, and from Animal
class Panther extends Cat {

    // specifies the colour attribute
    public $colour = "black";

    // overwrites the constructor function that would otherwise be
    // inherited from Animal, with a blank constructor.
    function Panther () {}

    // overwrites the method inherited from Cat
    function make_noise () {
        echo "ROARRRR!<br />";
    }
}

// this class inherits from Animal
class Snake extends Animal {
    public $legs = 0;
}

// this class is unrelated to the others
class PetShop {

    // set up an array to store the pets that the shop will stock
    public $pets = array ();

    // set up a variable to store the total cash in the pet shop
    public $cash;

    // this method creates a new object and adds it to the pets array
    function add_pet ($petclass, $price, $colour) {

        // set up a variable containing the number of elements in the pets array
        $n_pets = count($this->pets);

        // add to the pets array, a new instance of the class specified as
        // the first argument in this method, using the last argument as the
        // colour argument that is passed to the specified class's constructor
        $this->pets[$n_pets] = new $petclass($colour);

        // add a 'price' attribute to the pet object
        $this->pets[$n_pets]->price = $price;
    }

    // this method removes the specified pet from the array and adds the price
    // to the pet shop's cash variable
    function sell_pet ($n) {

        // add pet's price to the cash total
        $this->cash += $this->pets[$n]->price;

        // remove the pet object from the array
        array_splice($this->pets, $n, 1);

        // give a message about the sale
        echo "SALE: Pet no. ".$n." sold. Total cash is now \$".$this->cash.".<br /><br />";
    }

    // this method reports on the pet shop's stock
    function show_pets () {

        // show the number of pets available
        echo "<B>Shop stock:</B><br />We have ".count($this->pets)." pets for sale.";
        echo "<br /><br />";

        // iterate through the pets array and show information about each one
        for ($i = 0; $i < count($this->pets); $i++) {
            echo "<B>Pet No. ".$i.": </b>".$this->pets[$i]->report();
            echo "Price: \$".$this->pets[$i]->price."<br />";
        }
        echo "<br />";
    }
}

// instantiate a new PetShop object
$shop = new PetShop ();

// add three pets to the shop
$shop->add_pet(cat, 20, "tabby");
$shop->add_pet(snake, 40, "brown");
$shop->add_pet(snake, 60, "black");

// show the pet's stock
$shop->show_pets();

// sell the first pet in the stock
$shop->sell_pet(0);

// show the pet's stock after the sale
$shop->show_pets();
?>

28
আমি যদি গাড়ি বা প্রাণীগুলির সাথে আরও একটি ওপ উদাহরণ দেখি তবে আমি এটি হারাতে চাই
নীল ম্যাকগুইগান

5

ওপির অনুরোধে আমি আমার গেস্টবুক কোডটি ভাগ করব।
বার্তা শ্রেণি:

<?php 
Class message
{
    private $db;
    private $messageID;
    private $message;
    private $name;
    private $mail;

    public function setmessageID($messageID)
    {
        $this->messageID = $messageID;
    }

    public function getmessageID()
    {
        return $this->messageID;
    }

    public function setmessage($message)
    {
        $this->message = $message;
    }

    public function getmessage()
    {
        return $this->message;
    }

    public function setname($name)
    {
        $this->name = $name;
    }

    public function getname()
    {
        return $this->name;
    }

    public function setMail($mail)
    {
        $this->mail = $mail;
    }

    public function getMail()
    {
        return $this->mail;
    }
}

বার্তা ডেটা অ্যাক্সেস অবজেক্ট শ্রেণি:

<?php 
class messageDAO
{
    private $db;
    private $aantalMessages;
    private $messages;
    private $message;

    //bij laden roept hij automatisch Db class aan (en de daarbij gezeten functies)
    public function __construct(Db $db)
    {
        $this->db = $db;
    }

    public function getMessages()
    {
        return $this->messages;
    }

    public function getAantalMessages()
    {
        return $this->aantalMessages;
    }

    //Function to retrieve messages
    public function findMessages($args)
    {       
        $dbh = $this->db->DBH();

        //$offset for pagination
        $offset = ($args['currentPage'] - 1) * $args['itemsPerPage'];

        $sth = $dbh->prepare("SELECT    SQL_CALC_FOUND_ROWS
                                                    messageen.messageID, 
                                                    messageen.message, 
                                                    messageen.name, 
                                                    messageen.mail
                                            FROM    `messageen` 
                                            ORDER BY messageen.datumToegevoegd DESC 
                                            LIMIT   ?, ?");
        $sth->bindParam(1, $offset, PDO::PARAM_INT);
        $sth->bindParam(2, $args['itemsPerPage'], PDO::PARAM_INT);
        $sth->execute();
        $sth->setFetchMode(PDO::FETCH_ASSOC);

        $messages = array();

        while($row = $sth->fetch())
        {
            $message = new message();
            $message->setMessageID(htmlentities(strip_tags($row['messageID'])));
            $message->setSessage(htmlentities(strip_tags($row['message'])));
            $message->setName(htmlentities(strip_tags($row['name'])));
            $message->setMail(htmlentities(strip_tags($row['mail'])));  
            $messages[] = $message; 
        }

        $sth = $dbh->prepare("SELECT FOUND_ROWS() as numberOfMessages");
        $sth->execute();
        $sth->setFetchMode(PDO::FETCH_ASSOC);
        $this->numberOfMessages = $sth->fetch();

        return $messages;
    }

    public function setMessageToEdit($args)
    {   
        $sth = $this->db->DBH()->prepare("SELECT    messages.message
                                            FROM    `messages`
                                            WHERE   messages.messageID = ?");
        $sth->bindParam(1, $args['messageID']);
        $sth->execute();
        $sth->setFetchMode(PDO::FETCH_ASSOC);
        //return the retrieved message
        while($row = $sth->fetch())
        {
            $message = new message();
            $message->setMessage(htmlentities(strip_tags($row['message'])));
            $message->setMessageID(intval($args['messageID']));
        }

        return $message;
    }

    //functie om messageen aan te passen
    public function save(message $message)
    {   
        //insert part
        //if(isset($message->getname()) && isset($message->getmessage()) && isset($message->getMail()))
        //{
            $sth = $this->db->DBH()->prepare("INSERT INTO   `messages`
                                                    SET     messages.name = ?,
                                                            messages.mail = ?,
                                                            messages.message = ?,
                                                            messages.dateAdded = NOW()");
            $sth->bindParam(1, $message->getName());
            $sth->bindParam(2, $message->getMail());
            $sth->bindParam(3, $message->getMessage());
            $sth->execute();
        //}

        //update part       
        /*if(isset($message->getmessageID()) && isset($message->getmessage()))
        {
            $sth = $this->db->DBH()->prepare("UPDATE    `messageen`
                                                SET     messageen.message = ? 
                                                WHERE   messageen.messageID = ?
                                                LIMIT   1");
            $sth->bindParam(1, $message->getmessage());
            $sth->bindParam(2, $message->getmessageID());
            $sth->execute();
        }*/
    }
}

index.php

<?php
//include file loader.php
include("includes/loader.php");

$guestbook = new guestbook($db);
$user = new user($db);
$messageDAO = new messageDAO($db);

//Make a array named error
$error = array();

//Get action (login/setmessage/editmessage/deletemessage)
if(isset($_GET['action']))
{   
    switch ($_GET['action'])
    {   
        //if login submit is pressed
        case 'login':
            //Check if filled
            if(isset($_POST['username']) && isset($_POST['username']))
            {
                $error['usernameEmpty'] = (bool) !strlen(trim($_POST['username']));
                $error['passwordEmpty'] = (bool) !strlen(trim($_POST['password']));
            }

            if(in_array(1, $error))
            {
                //Assign $error to smarty
                $smarty->assign('error', $error);
            }

            else
            {
                if(isset($_POST['username']) && isset($_POST['username']))
                {
                    $user->setLoggedIn(array('username'=>$_POST['username'],
                    'password'=>$_POST['password']));

                    if($user->getLoggedIn() != true)
                    {                   
                        $smarty->assign('loggedInError', $user->getLoggedIn());
                    }
                }
            }
            break;

        //Als if "place message" is pressed
        case 'placemessage':
            //if user is not logged in
            if($user->getLoggedIn() != true)
            {
                //Controleren of message-velden wel zijn ingevuld
                $error['nameEmpty'] = (bool) !strlen(trim(htmlentities(strip_tags($_POST['messagename']))));
                $error['mailEmpty'] = (bool) !strlen(trim(htmlentities(strip_tags($_POST['messageMail']))));
                $error['messageEmpty'] = (bool) !strlen(trim(htmlentities(strip_tags(str_replace('place message...','', $_POST['messageInput'])))));

                if($error['mailEmpty'] != 1)
                {
                    $error['mailInvalid'] = !filter_input((INPUT_POST), 'messageMail', FILTER_VALIDATE_EMAIL);
                }

                if(in_array(1, $error))
                {
                    $smarty->assign('error', $error);
                }

                else
                {
                    $message = new message();

                    $message->setname($_POST['messagename']);
                    $message->setMail($_POST['messageMail']);
                    $message->setmessage($_POST['messageInput']);

                    dump($message);

                    //place message             
                    $messageDAO->save($message);
                }
            }

            //if user is logged in
            else 
            {
                //is message filled?
                $error['messageEmpty'] = (bool) !strlen(trim(htmlentities(strip_tags(str_replace('place hier uw message...','', $_POST['messageInput'])))));

                if($error['messageEmpty'] != 1)
                {   
                    $user->setUser();

                    $guestbook->placemessage(array('name'=>$user->getLoggedInUsername(), 
                    'mail'=>$user->getLoggedInUserMail(),
                    'messageInput'=>$_POST['messageInput']));
                }

                else 
                {
                    $smarty->assign('error', $error);
                }
            }
            break;

        case 'deletemessage':
            $user->setUser();

            if($user->getLoggedInUserAdmin() == 1)
            {
                if(isset($_GET['messageID']) && is_numeric($_GET['messageID']) && isset($_GET['key']))
                {
                    $guestbook->setURLKey($_GET['messageID']);

                    if($guestbook->getURLKey() == $_GET['key'])
                    {                   
                        $guestbook->verwijdermessage(array('messageID'=>$_GET['messageID']));
                    }
                }
            }
            die(header("location: /index.php"));
            break;
    }
}

if(isset($_GET['pagina']) && is_numeric($_GET['pagina']))
{

    $currentpage = $_GET['pagina'];
}

else
{
    //$currentpage is 1
    $currentpage = 1;
}

$user->setUser();

//assign var to smarty
$smarty->assign('messages', $messageDAO->findmessages(array('currentpage'=>$currentpage, 'itemsPerPagina'=>10)));
$smarty->assign('user', $user);

//Pagination

$numbermessages = $messageDAO->getnumbermessages();


$totalpages = ceil($numbermessages['numbermessages'] / 10);


if($currentpage < 1)
{
    //$currentpage is 1
    $currentpage = 1;
}


if($currentpage > $totalpages)
{

    $currentpage = $totalpages;
}

$smarty->assign('numbermessages', $messageDAO->getnumbermessages());
$smarty->assign('guestbook', $guestbook);
$smarty->assign('currentpage', $currentpage);
$smarty->assign('totalpages', $totalpages);

//display index.tpl
$smarty->display('index.tpl');

আমি আপনার কিছু অর্থের জন্য পরিবর্তনশীল এবং ফাংশনটির নাম পরিবর্তন করেছিলাম (ডাচ থেকে ইংরাজীতে অনুবাদ: পি) যাতে আপনি কিছু অদ্ভুত প্রেরণ খুঁজে পান কারণ আমি কেবল একটি দ্রুত প্রতিস্থাপন করেছি ইত্যাদি এটির সাথে মজা করুন। এছাড়াও এটি পুরো কোডটি নয় কারণ এর ফলে 20 কোডের মতো ফাইলের পোস্ট করা হবে: পি


3

এক্সপ্লোশন পিলস দ্বারা উল্লিখিত হিসাবে, একটি জটিল অ্যাপ্লিকেশনটিতে বেশিরভাগ অবজেক্ট রিয়েল ওয়ার্ল্ড সত্তা (যেমন একটি বোর্ডিং পাস, চালান, বা এমপি 3 ফাইলের চেয়ে অ্যাপ্লিকেশন উপাদানগুলির সাথে সম্পর্কিত হয় (যেমন ডাটাবেস সংযোগ পুল, কমান্ড, ডেটা স্ট্রাকচার যেমন হ্যাশম্যাপস) to )। ডিজাইনের ধরণগুলিতে অনেকগুলি ভাল বই রয়েছে যা আপনাকে এই উপায়গুলিতে দেখায় যে লোকেরা এই অঞ্চলে পুনরাবৃত্ত হওয়ার সমস্যাগুলির অনেকগুলি সমাধান করেছে। জিওএফ বইটি যেমনটি জানা গেছে এটি পুরোপুরি তবে খুব শুকনো, হেড ফার্স্ট ডিজাইনের প্যাটার্নগুলি আরও অ্যাক্সেসযোগ্য হতে পারে।

বাস্তব বিশ্বের বিশ্লেষণ এবং নকশার ক্ষেত্রে। বিশেষ্য এবং ক্রিয়াপদের ক্ষেত্রে এটি ভাবতে সহায়তা করে। উদাহরণস্বরূপ একটি ভিডিও ndingণ গ্রন্থাগার (এইগুলি কি এখন অপ্রচলিত?) এ এই জিনিসগুলি / বিশেষ্য থাকতে পারে:

  • ভিডিও
  • অধমর্ণ

ক্রিয়াপদের ক্ষেত্রে:

  • Borণগ্রহীতা দীর্ঘ সময় ধরে একটি ভিডিও বের করতে পারে
  • একজন rণগ্রহীতা স্টোরগুলিতে একটি ভিডিও ফিরিয়ে দিতে পারে etc.

এরপরে এগুলিকে অপারেশন সহ ক্লাসে রূপান্তরিত করা যেতে পারে (আমি কোনও পিএইচপি করেছি তাই অনেক দিন হয়ে গেছে তাই আমি এড়াতে পারি):

class Borrower
{
  public void borrow(Video video, int daysToBorrow)
  {
     ...
  }

  public void returnVideo(Video video, boolean calculateFine)
  {
     ...
  }
}

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


1

সর্বোত্তম কাজটি হ'ল আপনার অ্যাপ্লিকেশনটির মূল - "পোস্ট", "ব্যবহারকারী", "পোস্ট :: ফাইন্ডবাইনেম ()", "ব্যবহারকারী-> বৈধতা ()" ইত্যাদির দিকে মনোনিবেশ করার উপায় খুঁজে বের করা এবং উদ্বেগের দরকার নেই নদীর গভীরতানির্ণয় সম্পর্কে অনেক বেশি - কীভাবে ডাটাবেস টেবিলগুলিতে পোস্টগুলি আঠালো করা যায়, কীভাবে কোনও পোস্টের জন্য প্রদর্শনটি বিভিন্ন অনুসন্ধানের মধ্যে সামঞ্জস্য রাখতে হয় এবং কীভাবে "ডাটাবেস রেকর্ডে" প্রবেশ পোস্ট "ফর্মটি আঠালো করতে হয়।

ভাগ্যক্রমে, প্রচুর ফ্রেমওয়ার্ক রয়েছে যা এটি আপনার জন্য করে; ওও ওয়েব অ্যাপ্লিকেশনগুলির প্রভাবশালী দৃষ্টান্তটি হ'ল "মডেল-ভিউ-কন্ট্রোলার", এটি এমভিসি নামেও পরিচিত ; পিএইচপি-তে, আপনি ব্যবহার করতে পারেন এমন অনেকগুলি অফ-শেল্ফ এমভিসি ফ্রেমওয়ার্ক রয়েছে।

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

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.