Задать вопрос
  • Почему использование !important крайне не желательно?

    gluck59
    @gluck59
    Виртуальный глюк
    Кто вам сказал такую глупость? Спросите его — а почему в автомобиле крайне нежелательно включать третью передачу?
    Important — это такой же инструмент, как и все остальные. Пользы от него ровно столько же, сколько и зла, то есть все зависит от вас.
    Ответ написан
    Комментировать
  • Где лучше качество кода?

    Maksclub
    @Maksclub Куратор тега PHP
    maksfedorov.ru
    Все плохо
    • Глобальные переменные — зло
    • На лицо некий код, который и с сессией работает и с БД — явное нарушение общепринятных принципов, например SRP
    • $dao как инициализирована? Явно не через конструктор
    • Использование цифры, вот сиди гадай по ней — это плохо, используйте именованную константу. Например 3 — это некий статус для desktop, вот и назовите ее STATUS_DESKTOP, хотя далее...
    • вы обращаетесь к одному методу, который шибко умный — работает с флагами, тем самым нарушая SRP и сам содержит if/else, сделайте просто 2 раздельных метода:
      getMobileOpinionList()
      getDefaultOpinionList()

    • Предикат лучше вынести в отдельный метод isMobileOnly(), тк условия могут поменяться в нем, не будете же везде в if менять по всему проекту
    Ответ написан
    33 комментария
  • Как получить значение поля дочернего класса родительским методом?

    @EShaRA
    Получить значение поля дочернего класса родительским методом нельзя - так как родительский метод про поля дочернего класса ничего не знает;
    В Вашем случае возможно объявить функцию ShowDebugInfo как virtual в родительском классе и реализовать (переопределить) этот метод в дочернем;
    Однако проблема может быть глубже, дело в том, что в вашем дочернем классе фактически присутствуют два поля MagicSpellInfo SpellInfo - один в родительском и один в дочернем (поле родительского класса объявлено private и потому недоступно в дочернем); Возможно стоит объявить MagicSpellInfo SpellInfo protected в родительском классе, и удалить дубликат из дочернего;
    Ответ написан
    1 комментарий
  • Как получить значение поля дочернего класса родительским методом?

    @MarkusD Куратор тега C++
    все время мелю чепуху :)
    Метод IMagicSpell::ShowDebugInfo у тебя обращается к приватному полю IMagicSpell::SpellInfo. Это поле недоступно для наследников, т.к. является приватным.
    Конструктор-же, Fireball::Fireball, у тебя работает с приватным полем Fireball::SpellInfo.
    Поля IMagicSpell::SpellInfo и Fireball::SpellInfo являются разными, расположены в разных областях памяти объекта Fireball и в принципе никак не могут пересечься своими данными.
    Размер твоего Fireball будет с два MagicSpellInfo плюс размер таблицы виртуальных символов.

    От причины можно перейти к достижению желаемого поведения.
    Самое главное - второй экземпляр MagicSpellInfo в иерархии - лишний. Fireball::SpellInfo является дублирующим, лишним полем, которое не позволяет добиться необходимой тебе функциональности. Ведь в обоих твоих классах тебе надо работать с одними данными, с полем IMagicSpell::SpellInfo.
    Просто удаляем Fireball::SpellInfo.
    Fireball
    class Fireball: public IMagicSpell {
      public:
        Fireball() {
          SpellInfo.Name = "Огненный шар";
          SpellInfo.Description = "Мощный огненный шар, сметающий все на своем пути.";
          SpellInfo.Type = fire;
          SpellInfo.MinDamage = 30;
          SpellInfo.MaxDamage = 50;
          SpellInfo.Range = 40;
          SpellInfo.Distance = 120;
        }
    
        virtual ~Fireball() {}
    
        virtual void Use() {
          cout << "Boom!" << endl;
        }
    };


    Но теперь мы не скомпилируемся. Компилятор напишет что IMagicSpell::SpellInfo является приватным и недоступен для потомков. Исправить это тоже очень легко.
    Есть три вида секций доступа к полям и функциям класса:
    1. private - приватный доступ, только для экземпляра текущего класса;
    2. protected - ограниченный доступ, только для экземпляров текущего класса и всех публичных наследников; доступ ограничивается при ограниченном или приватном наследовании;
    3. public - публичный доступ, для всех пользователей экземпляров класса.

    Нам надо сменить права доступа к IMagicSpell::SpellInfo с приватного на ограниченный. В этом случае экземпляры Fireball смогут обращаться к IMagicSpell::SpellInfo как к своему ограниченному полю.
    IMagicSpell
    class IMagicSpell {
      protected:
        MagicSpellInfo SpellInfo;
    
      public:
        virtual ~IMagicSpell() {}
        virtual void Use() {}
    
        MagicSpellInfo GetInfo() {
          return this->SpellInfo;
        }
    
        void ShowDebugInfo() {
          cout << "Название: " << SpellInfo.Name << endl;
          cout << "Описание: " << SpellInfo.Description << endl;
          cout << "Тип: " << SpellInfo.Type << endl;
          cout << "Мин. урон: " << SpellInfo.MinDamage << endl;
          cout << "Макс. урон: " << SpellInfo.MaxDamage << endl;
          cout << "Расстояние: " << SpellInfo.Distance << endl;
          cout << "Радиус: " << SpellInfo.Range << endl;
        }
    };


    В таком виде ты сможешь добиться желаемой функциональности. Но куда более важно чтобы тебе было понятно, как именно ты этого добился.
    Ответ написан
    1 комментарий
  • Как заменить все слова "Привет", "Ок" на "Hello", "Ok"?

    Stimulate
    @Stimulate
    могу
    echo str_replace(array('Привет', 'Ок'), array('Hello', 'Ok'), $html);
    Ответ написан
    3 комментария
  • Как работать с JSON-RPC 2.0?

    Immortal_pony
    @Immortal_pony Куратор тега PHP
    $apiUrl = "https://api.shiptor.ru/public/v1";
    $apiKey = "YOUR_KEY";
    $client = new \JsonRPC\Client($apiUrl);
    
    // Set headers
    $client->getHttpClient()->withBeforeRequestCallback(function(HttpClient $client, $payload) {
        $client->withHeaders([
            "Content-Type: application/json",
            "x-authorization-token: {$apiKey}"
        ]);
    });
    
    // Fetch something
    $method = "calculateShipping";
    $params = ['paramName'=>"paramValue"];
    $result = $client->execute($method, $params);
    Ответ написан
    2 комментария