Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

D repin/hw 6 #1203

Open
wants to merge 18 commits into
base: DRepin/main
Choose a base branch
from
Open

D repin/hw 6 #1203

wants to merge 18 commits into from

Conversation

Singurix
Copy link

No description provided.

@@ -0,0 +1,16 @@
[mysqld]
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Совет: не нужно добавлять те файлы которые не нужны для работы ДЗ.

while ($clientStarted) {
$consoleMessage = fgets(STDIN);
if (trim($consoleMessage) == 'stop') {
$clientStarted = false;
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Тут можно сделать break и тогда можно избавится от переменной $clientStarted и от else


private function readMessage($sock): void
{
$socketMsg = false;
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Немного запутанный код. Будет проще если:

  1. В цикле ждать соединения
  2. Как только получили соединение в другом цикле обрабатывать сообщения от клиента.

public function start(): void
{
$clientStarted = true;
$sock = (new SocketChat())->isServerRun()->create()->connect();
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Мы создаём инстанс друго-го класса. Лучше его создать где-то во вне и сюда инъектить как зависимость.

*/
public function start(): void
{
$sock = (new SocketChat())
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Мы создаём инстанс друго-го класса. Лучше его создать где-то во вне и сюда инъектить как зависимость.

if (trim($consoleMessage) == 'stop') {
$clientStarted = false;
} else {
socket_write($sock->socket, $consoleMessage, strlen($consoleMessage));
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Тут у нас протекла абстракция. У нас есть класс который абстрагирует нас от некоторых низкоуровневых вызовов методов сокета. Но не от всех, тут мы всё равно их используем. Стоит их перенести в класс SocketChat. Данное замечание валидно для всех мест.

*/
public function __construct()
{
$configFile = '/app/config.ini';
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Лучше будет отделить конфигурацию в отдельный класс и инкапсулировать всю логику там. И сюда конфиг инъектить как зависимость.

{
return $this->config['socket']['file'];
}
}
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Нужно поправить все замечания линтера.

->create()
->bind()
->listen();
socket_set_nonblock($sock->socket);
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

вместо конкретного класса SocketChat создайте интерфейс и везде используйте его вместо конкретной реализации

Вот такой подход не понял, можно поподробнее информацию или где-то почитать?

private function readMessage($sock): void
{
do {
if ($socketMsg = socket_accept($sock->socket)) {
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Тут, как и в других участках кода, протекает абстракция. Чтобы исправить, сделайте свойство socket внутри SocketChat приватным и перепишите код.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants