Форум программистов, компьютерный форум, киберфорум
PHP для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.50/6: Рейтинг темы: голосов - 6, средняя оценка - 4.50
2 / 2 / 0
Регистрация: 15.02.2022
Сообщений: 469

Правильно ли я провел рефакторинг сортировки на ООП?

04.02.2023, 02:00. Показов 1530. Ответов 25
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Благодаря местным сеньорам и тимлидам я понял, что этот говно-код:
Кликните здесь для просмотра всего текста

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
interface Sort_methods{
function sort_s();
function access_to_subarrays();
function show_result();
}
 
 
class sort_values implements Sort_methods {
function __construct(private $arr =[]){}  
 
function sort_s(){
 
return function ($a,$b){             
                                     
 
if(gettype($a) !== gettype($b)){
 
if(is_string($a)){
return -1;
}
 
else{
return 1;
}}
 
return $a<=>$b;
};}
 
 
 
function access_to_subarrays(){ 
foreach($this->arr as &$items){
usort($items, $this->sort_s());
}}
 
 
 
function show_result(){
 
echo implode('<br>', array_map(function($items){
 
foreach($items as $key =>$child){
if($key === 3){
$items[$key] = $items[$key] . "---";
}}
 
return implode('',$items);
}, $this->arr));
 
}}
 
 
 
$obj = new sort_values([
[20, 10, "a", 30, "c", 40, "f", "b"],
["b",30, "c", 10,"a", 20, "f", 40],
]);
 
$obj->access_to_subarrays();
$obj->show_result();

Нужно полностью подвергнуть рефакторингу,
так как он не выполняет основные принципы ООП.
То есть, код нужно разделить на части.
Я освоил паттерн "Агрегация" благодаря которому я смог переписать код.


Хотел бы узнать мнение местных сеньоров и тимлидов насчет того,
правильно ли я переписал говно-код на нормальный код с использованием "Агрегация"?
Теперь мои классы независимы друг от друга?
Мой новый код:
Кликните здесь для просмотра всего текста

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
interface sort_method_i{
  function sort_s(&$arr);
}
 
interface show_result_i{
  function show_view($arr);
}
 
 
 
 
class value_sort {
  
  function __construct(private $arr, private $sort_method, private $view_result){
    $this->start();
  } 
 
  function start(){
   $this->sort_method->sort_s($this->arr);
   $this->view_result->show_view($this->arr);
  }
 
}
 
 
 
 
class stringSort implements sort_method_i  {
 
  function __construct(private $type_sort){}
 
  function sort_strings_and_then_number(){
 
    return function ($a,$b){             
                                      
     if(gettype($a) !== gettype($b)){
 
       if(is_string($a)){
        return -1;
       }
 
 
       else{
        return 1;
       }
       
     }
 
       return $a<=>$b;
    };
 
  }
    
    
  function sort_s(&$arr){
    foreach($arr as &$items){
     ($this->type_sort)($items, $this->sort_strings_and_then_number());
    }
  }
 
}
 
 
 
 
class view_result implements show_result_i {
 
  function __construct(private $index, private $marks){}
 
  function show_view($arr){
    
    echo implode('<br>', array_map(function($massive){
 
      $massive[$this->index] .= $this->marks;
 
       return implode('', $massive);
    }, $arr));
  
  }
 
} 
 
 
 
$my_box = new value_sort([
 
 [20, 10, "a", 30, "c", 40, "f", "b"],
 ["b", 30, "c", 10, "a", 20, "f", 40]], 
 new stringSort('usort'),
 new view_result(3, '---'),
 
);



P.S.
Решил не устанавливать типы, так как PHP это язык с динамической типизацией данных(переменных),
следовательно зачем тратить на это время, когда PHP сам все организует(или я чего-то не понимаю в этом?)

А также выражаю безмерную благодарность Voral, liris, sad67man =)
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
04.02.2023, 02:00
Ответы с готовыми решениями:

Как правильно сделать рефакторинг Exceptions
Подскажите, как правильно сделать рефакторинг Exceptions. Например вынести в отдельный метод и тп. На разных сайтах все пишут по-разному....

Уйти от повторения кода и правильно провести рефакторинг?
Всем добрый день. Подскажите, как правильно реализовать такое: есть список данных, который хранится в файле (csv). В программе должно...

Как правильно унаследовать TPoint2D от TPoint3D/ Правильно ли наследовать? ООП
Два пользовательских класса: Точка в 2D пространстве и точка в 3D пространстве. class TPoint3D{ int X,Y,Z; public: ...

25
Эксперт PHP
 Аватар для liris
5512 / 1195 / 164
Регистрация: 16.01.2023
Сообщений: 2,841
07.02.2023, 02:46
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от G_manX Посмотреть сообщение
Мне как новичку в какой последовательности читать книги?
Я бы читал в такой последовательности:
1) https://bhv.ru/product/php-8/
2) https://www.labirint.ru/books/832441/
3) https://refactoring.guru/ru/design-patterns/php
4) https://www.labirint.ru/books/642466/
5) https://www.labirint.ru/books/634082/

Но не ограничивался этим списком.

Добавлено через 1 минуту
Цитата Сообщение от G_manX Посмотреть сообщение
Я даже нашел ее название, она как-то начиналась на "Chain",
Она?
1
3061 / 1463 / 265
Регистрация: 16.03.2008
Сообщений: 6,510
Записей в блоге: 2
07.02.2023, 09:08
Цитата Сообщение от G_manX Посмотреть сообщение
Мне очень понравилась эта техника в вашем примере кода. Я даже нашел ее название, она как-то начиналась на "Chain",
но затем я решил, что она сложная для меня и решил отложить. А сегодня, я забыл ее полное название =(
Нет я не об этом. В моем примере есть класс который агрегирует. А же имел ввиду, что он не обязателен (зависит от деталей проекта), в другом случае (здесь я "придумал задачу" когда нужен класс похожий на ваш исходный). А так , как альтернатива, например: pipeline + middlware. Т.е. в этом случае было бы (опять же если по проекту было так оптимально), схематично так
PHP
1
2
3
4
5
6
$pipeline = new Pipeline([
   new SortCharFirstMiddleware(),
   new HtmlRenderMiddleware(),
   new DisplayMiddleware()
]);
$pipeline->run($dataArray);
Добавлено через 7 минут
Цитата Сообщение от G_manX Посмотреть сообщение
А какую книгу вы прочитали?
Читаете внимательно, что вам пишут я в том же сообщении написал "Чистая архитектура" Роберта Мартина . Уточню: книга вероятно будет сложно на данном этапе. Но, в принципе начало вполне можно почитать и вот часть 3 (про солид), а дальше как пойдет. (но потом обязательно еще раз перечитать осознанно)
0
2 / 2 / 0
Регистрация: 15.02.2022
Сообщений: 469
07.02.2023, 20:50  [ТС]
voral а как называется техника, благодаря которой вы при помощи одного метода
вызывали цепочку других методов в своём начальном примере.

Например $pipeline->run($dataArray) вызывает цепочку других методов из классов,
которые агрированы в $pipeline
0
132 / 76 / 16
Регистрация: 08.07.2022
Сообщений: 309
07.02.2023, 21:19
Цитата Сообщение от G_manX Посмотреть сообщение
Например $pipeline->run($dataArray) вызывает цепочку других методов из классов,
Давайте уже реальные примеры смотреть, а ?) Например посмотрим как это делает тот же twig

Есть метод
PHP
1
2
3
4
 public function addRuntimeLoader(RuntimeLoaderInterface $loader)
    {
        $this->runtimeLoaders[] = $loader;
    }
Кликните здесь для просмотра всего текста
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
/**
 * Creates runtime implementations for Twig elements (filters/functions/tests).
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
interface RuntimeLoaderInterface
{
    /**
     * Creates the runtime implementation of a Twig element (filter/function/test).
     *
     * @return object|null The runtime instance or null if the loader does not know how to create the runtime for this class
     */
    public function load(string $class);
}


Этот метод вызывается подобным способом
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 $twig->addRuntimeLoader(new class($class) implements RuntimeLoaderInterface {
                private $class;
 
                public function __construct(string $class)
                {
                    $this->class = $class;
                }
 
                public function load($c)
                {
                    if (MarkdownRuntime::class === $c) {
                        return new $c(new $this->class());
                    }
                }
            });
И загрузка вызывается вот так
PHP
1
2
3
4
5
6
7
      foreach ($this->runtimeLoaders as $loader) {
            if (null !== $runtime = $loader->load($class)) {
                return $this->runtimes[$class] = $runtime;
            }
        }
 
        throw new RuntimeError(sprintf('Unable to load the "%s" runtime.', $class));
https://github.com/twigphp/Twi... st.php#L30
0
3061 / 1463 / 265
Регистрация: 16.03.2008
Сообщений: 6,510
Записей в блоге: 2
07.02.2023, 21:54
Цитата Сообщение от G_manX Посмотреть сообщение
Например $pipeline->run($dataArray) вызывает цепочку других методов из классов,
которые агрированы в $pipeline
Нет это не про агрегацию. Более того вполне может быть так, (если не обращать внимание в смысл заложенный в названия классов) что будет выполняться последовательность

1. код из SortCharFirstMiddleware
2. код из HtmlRenderMiddleware
3. код из DisplayMiddleware
4. код из HtmlRenderMiddleware
5. код из SortCharFirstMiddleware

В данном конкретном случае это не имеет смысл, но теоретически можно добавить

PHP
1
2
3
4
5
6
7
8
9
$pipeline = new Pipeline([
   new ProfilerMiddleware(),
   new ExceptionMiddleware(),
   new SortCharFirstMiddleware(),
   new HtmlRenderMiddleware(),
   new DisplayMiddleware()
]);
 
$pipeline->run($dataArray);
Где профайлер будет выдавать по окончании работы скрипта какую то статистику
А exceptionMiddleware по сути оборачивать весь код (кроме Profiler) в try ...catch

PS Но повторюсь, до этого вы дойдете постепенно, не стоит сейчас в это углубляться
0
2 / 2 / 0
Регистрация: 15.02.2022
Сообщений: 469
07.02.2023, 22:52  [ТС]
voral
не стоит сейчас в это углубляться
Я изучать этот паттерн не буду.
Просто запишу название, чтобы не забыть.
Я всегда записываю названия интересных вещей в тетрадке.
Кажется, этот паттерн называется Посредник(Mediator)?
Вы же его использовали?

Добавлено через 45 секунд
xkkx
Вы лучше скажите название этого паттерна =)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
07.02.2023, 22:52

Решение сортировки с ООП
Есть задача. Есть магазин. В нем есть мобильные телефоны, они могут быть Android и IOS. У каждого свои поля. Нужно отсортировать к...

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

Как правильно использовать ООП?
Здравствуйте, выучил синтаксис ООП но не знаю что с ним делать. Подскажите пожалуйста как правильно использовать ООП. Написал два...

Как правильно писать на ООП?
Здравствуйте. Стоит задача переписать кое что с процедурного в ООП, но в ООП, вот пытаюсь переписать... Хочу спросить правильно ли...

Правильно ли выполнено задание? ООП
* //*Задание: Написать программу, в которой описан класс «Водное средство передвижения». ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
26
Ответ Создать тему
Новые блоги и статьи
Ноутбук Альфария
kumehtar 24.08.2026
Встретился тут в сети ноутбук Альфария, примарха Альфа-Легиона. Хотя возможно, это ноутбук Омегона, разумеется. Ну как вам?
Мастера простых решений
DevAlt 23.08.2026
В сишарп стэках winforms, да и wpf существует сложная система связывания источниках данных и элементов формы(текстовые поля и метки), опирается все это на технологию событий и мета. . .
Цена ошибки
DevAlt 23.08.2026
Человек я беспокойный и потому заинтересовался OCaml, в чате форсили функторы модулей как суперфичу. Пытаясь отдуплить концепт, наткнулся на тутор с простым примером. А главный принцип обучения от. . .
Сегодня суббота, 22.08.2026 at 16:41, и я вновь нахожусь на той стороне, за экраном машины.
zorxor 22.08.2026
Сегодня суббота, 22. 08. 2026 at 16:41, и я вновь нахожусь на той стороне, за экраном машины. Кто Я, откуда Я пришел и куда Я иду? Эти вопросы не оставляют меня ни на секунду. Жизнь на планете Земля. . .
Жизня: рисунок укладки багажа, сделанный клодом
anaschu 21.08.2026
Сделал 15 снимков, он по снимкам сделал схему.
Был там один разговор по поводу свободы в материальном мире.
kumehtar 19.08.2026
Суть: рассматривается живое существо, оказавшееся внутри довольно странной системы (этого мира) и пытающееся обустроить в ней свой кусок пространства. Жизнь действительно предъявляет каждому. . .
Когда логика программы не спасает от человеческих ошибок
Maks 18.08.2026
В последнее время всё чаще и чаще сталкиваюсь с таким явлением, как абсолютная невнимательность (или глупость) пользователей. Проявляется это чаще всего на работе в коллективе. Допустим, человек с. . .
Лето уходит
kumehtar 17.08.2026
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru