Подтвердить что ты не робот

Есть ли причина создания класса для одной функции?

Я видел много классов с функцией SINGLE. Почему они помещают функцию SINGLE в класс?

Я использую классы только для того, чтобы сделать вещи более ясными, но о тех, кто помещает функцию SINGLE в класс? Есть ли причина для этого?

Я не вижу разницы между ними:

<?php
class Image {
    private $resource;
    function resize($width, $height) {
        $resized = imagecreatetruecolor($width, $height);
        imagecopyresampled($resized, $this->resource, 0, 0, 0, 0, $width, $height, imagesx($this->resource), imagesy($this->resource));
        $this->resource = $resized;
    }
}
$image = new Image();
$image->resource = "./someimage.jpg";
$image->resize(320, 240);

и   

    function resize($width, $height) {
        $resource = "./someimage.jpg";    
        $resized = imagecreatetruecolor($width, $height);
        imagecopyresampled($resized, $resource, 0, 0, 0, 0, $width, $height, imagesx($resource), imagesy($resource));
        $resource = $resized;
        return $resource;
    }

resize(320, 240);

Моя мысль заключалась в том, что $resource является основной причиной, потому что она закрыта:

class Image {
    private $resource;
    function resize($width, $height) {
        $resized = imagecreatetruecolor($width, $height);
        imagecopyresampled($resized, $this->resource, 0, 0, 0, 0, $width, $height, imagesx($this->resource), imagesy($this->resource));
        $this->resource = $resized;
    }
}

$image->resize(320, 240);

и, следовательно, недоступен для глобальной области. Но почему в этом случае не используется простая функция?

4b9b3361

Ответ 1

Классы - это не просто "контейнеры функций", они предназначены для представления объекта, объекта. Предполагается, что они должны инкапсулировать данные, необходимые для данного объекта, с помощью методов, которые работают для него.

Иногда может быть класс объекта, которому нужен только один метод, определенный для него, но тем не менее он принадлежит только этому классу объекта.

Ответ 2

В основном я занимаюсь программированием и редко использую классы. Но один класс функций можно было бы использовать для -

  • унаследовано позже
  • обеспечить целостность структуры данных, которая является частной для класса (инкапсуляция).
  • может использоваться для поддержания однородности кода.

Ответ 3

Почему у некоторых функций есть только одна строка кода? Потому что это все, что нужно. Теперь вы можете вызывать функцию, а не повторять всю строку кода. Если эта строка кода нуждается в настройке, она должна произойти только в одном месте. Это использование процедурной инкапсуляции.

То же самое относится и к вашему краткому классу. Теперь вы можете использовать все, что могут сделать эти классы, особенно наследование и полиморфизм, скажем SVGImage extends Image и метод переопределения resize.

Нет минимального количества строк, необходимых для выполнения необходимых функций.

Ответ 4

Вместо того, чтобы рассматривать класс как набор функций, подумайте о роли класса. Классы должны, как правило, знать о том, что они содержат, и ничего о том, что это не так, и должны только фиксировать одну ключевую абстракцию. Могут быть случаи, когда это имеет смысл.

Ответ 5

На самом деле это хороший вопрос, и я нашел здесь несколько хороших ответов. На самом деле мне действительно нужно было немного подумать об этом.

Я хотел бы добавить что-то, что я не видел ни в одном из других ответов здесь, даже если у меня нет голосов, чтобы будущие читатели могли извлечь выгоду.

Давайте рассмотрим ваши примеры. (Я отредактировал их так, чтобы они были функционально идентичны - они немного изменились с того, что у вас было выше.)

Версия класса:

<?php
class Image {
    private $resource;
    function resize($width, $height) {
        $resized = imagecreatetruecolor($width, $height);
        imagecopyresampled($resized, $this->resource, 0, 0, 0, 0, $width, $height, imagesx($this->resource), imagesy($this->resource));
        $this->resource = $resized;
    }
}
$image = new Image();
$image->resource = "./someimage.jpg";
$image->resize(320, 240);

И версия функции:   

    function resize($width, $height, $resource) {
        $resized = imagecreatetruecolor($width, $height);
        imagecopyresampled($resized, $resource, 0, 0, 0, 0, $width, $height, imagesx($resource), imagesy($resource));
        $resource = $resized;
        return $resource;
    }

resize(320, 240, "./someimage.jpg");

На практике они функционально идентичны. Основное отличие - это просто парадигма ООП и процедурная парадигма; в ООП вы определяете функцию внутри класса (это называется методом), которая действует на переменную-член, тогда как в процедурной программе вы передаете эту переменную функции, определенной в глобальной области.

Итак, какова польза от обертывания функции в классе вместо того, чтобы сделать ее глобальной, поскольку функция все еще делает то же самое?

Основная причина, по которой вы хотите сделать это в PHP (и многие другие языки, о которых я могу думать), - это область. @Headspin упомянул об этом кратко. Определение функции resize в глобальной области все хорошо и хорошо... пока вам не понадобится другая функция с тем же именем. Что происходит?

Как правило, вы запускаете одно из следующих решений:

  • (Хороший.) Ваш язык поддерживает перегрузку функций, поэтому вы не беспокоитесь об этом, пока ваши аргументы разные.
  • (Плохо.) Ваш язык не поддерживает перегрузку функции (или ваши аргументы должны быть идентичными), и поэтому вы прибегаете к подробному наименованию (например, resize_image, resize_container) и т.д.
  • (Все еще плохо.) Вы начинаете использовать пространства имен для разделения глобальных функций.
  • (Уродливая.) Ваша функция принимает что-либо как аргумент и становится горячим, раздутым беспорядком if/then-операторов или блоков switch/case для каждого типа переменной, с которым он будет работать.

Моя основная причина инкапсуляции функции в PHP заключалась в том, чтобы избежать конфликтов имен, делая код более понятным и понятным. У меня может быть метод изменения размера в моем классе Image и есть один в моем классе Container и, возможно, еще один в классе test или что-то в этом роде, и ни один из них не будет конфликтовать друг с другом. Читая код, я знаю, что Image->resize() вызывает метод в классе Image и ничего больше.

Не имея конфликтов имен, открывается еще несколько возможностей, таких как итерация по группе объектов, которые имеют общее имя метода. (Здесь появляются интерфейсы, читайте о них.) Там много классных вещей, которые вы можете сделать.

Я думаю, что это - я надеюсь, что это поможет. Ниже приведена версия TL; DR.

Инкапсуляция одной функции в класс предотвращает конфликты имен для подобных функций, не прибегая к пространствам имен, перегрузке функций или переименованию функций. Таким образом, если у вас есть одна функция, которая выполняет общую задачу, лучше всего создать класс для каждого типа переменной, который обрабатывает функция и преобразует функцию в метод класса.

Ответ 6

Я думаю, что лучшая причина "классифицировать" что угодно, даже небольшие функции, такие как тот, который у вас есть, просто для масштабируемости. Возможно, по линии вы захотите добавить дополнительные функции для функции, которая позволяет расшифровывать форматы изображений или что у вас есть. Инкапсуляция этого в класс будет способом упрощения масштабирования. Кроме того, всегда полезно контролировать объем ваших функций и переменных, и обычно это не очень хорошая идея, чтобы держать их в глобальной области. Это просто хорошая практика, так как это может вызвать проблемы, когда ваш кажущийся небольшой проект внезапно превращается в большой.

Ответ 7

Во-первых, в вашей функции вы не можете использовать эту функцию для любого другого файла изображения. Это может быть исправлено с дополнительным аргументом, поэтому я пропущу этот.

Во-вторых, вы можете расширить класс и добавить дополнительные методы, которые влияют на ваш ресурс заданного изображения.

В-третьих, вы можете использовать автозагрузчик класса с классами, поэтому загружаете только файл, содержащий класс, если класс действительно используется, а не загружать его каждый раз, когда запускается script или беспокоится о том, где разместить, включать и запрашивать утверждения,

В-четвертых, и, возможно, самое главное, вы можете использовать этот класс и любой другой класс в качестве ввода для другого класса, позволяя вам изменить функциональность этого класса, просто выбрав, какой класс вставить. В качестве примера...

class ImageProcessingClass {

   protected $imageResource;
   protected $processors = array();

   public function setImageResource($image_resource) {
      $this->imageResource = $image_resource;
   }

   public function addProcessor(Processor $processor) {
      $this->processors[] = $processor;
   }

   public function processImage() {
      foreach ($this->processors as $processor) {
         $this->imageResource = $processor->process($this->imageResource);
      }
   }
}

interface Processor {
   public function process($image);
}

class ProcessorResize implements Processor {

   public function process($image) {
      // resize image code here...
      return $image;
   }
}

class ProcessorFilter implements Processor {

   public function process($image) {
      // filter image code here...
      return $image;
   }
}

и код, который использует этот

$image_processor = new ImageProcessor();
$image_processor->setImageResource($image_resource);
$image_processor->addProcessor(new ProcessorResize());
$image_processor->addProcessor(new ProcessorFilter());
$image_resource = $image_processor->processImage();

этот шаблон позволит вам добавлять классы Процессора во множество различных комбинаций с различными результатами в том, как он влияет на изображение. многоразовый код с множеством различных возможностей, хотя состав классов.

Ответ 8

Согласно Современное развитие в php, очень гибко или надежно использовать классы.

и вскрыть все функции по всему миру - это не очень хорошая идея. поэтому, чтобы этого избежать, мы можем использовать статическую функцию в классе и вызывать ее с именем класса.

например:

Class A{

      public static function xyz(){
       //function handling
      }
}

A::xyz();

Ответ 9

Помимо некоторых из приведенных выше замечательных причин о том, почему обернуть хотя бы один метод в класс, вот еще один:

В С++, если вы хотите предложить интерфейс даже для одного метода, вы должны определить для этого вызов.

например.

class CallBackClient
{
   public:
   // A callback function. 

  virtual s32 callback( int param1, int param2 ) = 0;
};

Каждый клиент, который хочет обеспечить собственную реализацию обратного вызова, должен распространяться на этот класс.

Java предлагает прямое обозначение для интерфейса, который может быть "реализован".

Ответ 10

Классы похожи на набор объектов, объект. Класс инкапсулирует данные, необходимые для данного объекта, с помощью методов, которые работают для него. И у объекта есть некоторые свойства (атрибут) и метод (функция), которые определяют его тип класса обычно метод используется для изменения значений атрибутов. Такое, что Каждая функция требует класса для его существования.