Задать вопрос
  • Где взять реальные примеры кода использования ооп в веб-сервисах?

    @netcore
    Есть группа людей которые не понимают в программировании ничего, но у них есть идея, понимание как работает продукт, и деньги (но это вторично)
    Назовем эту группу людей бизнес

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

    Сначала бизнес описывает боль которую решает продукт
    В чем боль? Бизнес раньше продавал газеты, а теперь хочет свою интернет газету.
    1. Они не хотят тратить деньги на печать, а просто делать посты новостей и статьи.
    2. Они не хотят платить деньги на транспортные расходы развозить газеты, а делать рассылки на электронную почту
    3. Они хотят получать обратную связь (комментарии)
    этого достаточно для примера.

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

    Затем описываются сущности этого продукта и действующие лица в этом продукте
    Что мы можем понять из этого? Какие у нас есть сущности?
    1. пост - новость или статья на сайте.
    1.1. На этом этапе выясняем у бизнеса в чем отличие новости от статьи.
    Бизнес говорит: у новости (например) есть только одна картинка, текст.
    У статьи есть так же текст но картинок может быть несколько, так же не может быть комментариев.
    Бизнес забыл про то что в дизайне есть еще и дата, тут уже додумывает сам программист взглянув на макеты.
    В итоге у нас получается одна абстрактная модель Post и две ее реализующие: Article и News.

    public abstract class Post
        {
            protected Post(string text, int writerId)
            {
                Text = text;
                CreationDate = DateTime.Now;
                WriterId = writerId;
            }
    
            public int Id { get; set; }
            public string Text { get; private set; }
            public DateTime CreationDate { get; private set; }
            //Идентификатор писателя статьи\новости
            public int WriterId { get; private set; }
    
            //Автоматически подтягиваемая из базы модель писателя через ORM по WriterId
            public virtual Writer Writer { get; set; }
    
        }
    
        public class Article : Post
        {
            public Picture[] Pictures { get; private set; }
    
            public Article(string text, int writerId, Picture[] pictures) : base(text, writerId)
            {
                Pictures = pictures;
            }
        }
    
        public class News : Post
        {
            public Picture Picture { get; }
            
            //Массив комментариев к посту
            // private set -- говорит о том что массив инкапсулирован
            // и управлять массивом можно только через метод AddComment
            public List<Commentary> Commentaries { get; private set; }
    
            public News(string text, int writerId, Picture picture) : base(text, writerId)
            {
                Picture = picture;
            }
    
            public void AddComment(Commentary commentary)
            {
                Commentaries.Add(commentary);
            }
        }


    Далее у нас есть ролевые модели и у каждого своя бизнес логика.
    2. Подписчик - получатель новостей. Бизнес хочет что бы каждый зареганый юзер автоматически стал подписчиком. Такого в реальном мире не будет, нельзя, но для примера норм.
    3. Писатель - тот кто пишет статьи\новости.

    Две эти модели отличаются между собой только ролью и наличием у подписчика поля email. По этому приведем вот такие ООП модели

    public abstract class User
        {
            public int Id { get; set; }
            public string Username { get; private set; }
            public string Role { get; private set; }
            
            protected User(string role, string username)
            {
                Role = role;
                Username = username;
            }
        }
    
        public class Subscriber : User
        {
            public string Email { get; private set; }
            
            public Subscriber(string username, string email) : base(nameof(Subscriber), username)
            {
                Email = email;
            }
        }
    
        public class Writer : User
        {
            public Writer(string username) : base(nameof(Writer), username)
            {
            }
        }


    Поле пароль опущено, тут много чего опущено для простоты восприятия.

    3. Комментарий - обратная связь от юзера в посте. При чем хочу заметить от ЮЗЕРА, бизнес говорит что писать могут как и подписчик так и писатель

    public class Commentary
        {
            public int Id { get; set; }
            public string CommentText { get; private set; }
            public int UserId { get; private set; }
            
            public virtual User User { get; private set; }
            
            public DateTime CommentCreationDate { get; private set; } 
            
            public Commentary(int userId, string commentText)
            {
                UserId = userId;
                CommentText = commentText;
                CommentCreationDate = DateTime.Now;
            }
        }


    Вот - хоть и примитивно и немного неправильно (а то щас налетят пет программисты) но мы описали модели, абстрагировали одинаковые поля в абстрактные классы. Инкапсулировали поля и добавили методы которые описывают как работает класс. Инициализация полей происходит только в конструкторах. Работа с полями только с предоставленными для этого методами.

    Прошу прощения что не PHP, но C# тоже C подобный, так что проблем с чтением на уровне моделей быть не должно.

    Одна из функций ООП -- что бы программисты понимали бизнес.
    Ну и человеку прозе описывать поведение реального мира объектами и как эти объекты между собой взаимодействуют.
    Есть целые методологии разработки ПО такие как DDD, где вообще ядро кода пишется на копароративном языке и жестко соблюдаются правила названия моделей и описания алгоритмов бизнес процессов бизнеса. Код получается самодокументированным. Были случаи когда ядро по DDD писали даже на русском, потому что бизнес большой, а новичкам, кто приходил кодить в фирму, было быстрее и проще вкатиться в понимание прикладной практики бизнеса и понять по коду как бизнес устроен на разных слоях.
    Ответ написан
    1 комментарий
  • Почему при объявлении переменной, в любом языке программирования, резервируется весь размер памяти отведённый под тип данных?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Если я просто объявил переменную типа short, то сколько памяти надо под неё выделить? А если записал в неё ноль? А если после этого записал в неё 65535? А где хранить количество выделенной для переменной памяти? И как перевыделять память, если она выделяется в стеке?

    P.S. А как вы представляете себе массив с доступом по индексу, если каждый элемент массива имеет свой размер?
    Ответ написан
    4 комментария
  • Почему при объявлении переменной, в любом языке программирования, резервируется весь размер памяти отведённый под тип данных?

    Stalker_RED
    @Stalker_RED
    Пример с SSD некорректный, все равно что требовать от камаза, например, выпустить грузовик с грузоподъемностью 20кг. Производителю нужен рынок сбыта.
    Тем не менее, небольшие чипы памяти существуют, только никто на них не пишет, что это "SSD".

    Выделение памяти - операция не бесплатная, и кто-то решил, что так будет выгоднее.
    https://randomascii.wordpress.com/2014/12/10/hidde...
    https://habr.com/ru/post/270009/

    Как-то всё топорски устроено
    Вы можете написать сви менеджеры памяти,компиляторы и другие сопутствующие штуки. Не исключено, что обретете мировую известность. Но не думайте, что до вас никто не пытался.
    Ответ написан
    2 комментария
  • Как сделать динамическую подгрузку данных при выборе пункта из выпадающего списка формы в Yii2?

    @parazitl2 Автор вопроса
    Решил проблему как написал Станислав Казанин.

    Выпадающий список, при выборе пункта из которого будет обновляться поле на странице с данными пользователя (id списка например "useridfield") :
    <?php echo $form->field($model, 'user_id')->widget(Select2::classname(), [        
            'data' => ArrayHelper::map(User::find()->all(), 'id', 'username'),
            'language' => 'ru',
            'options' => ['placeholder' => 'Выберите пользователя ...', 'id' => 'useridfield', 'value' => Yii::$app->user->identity->getId(),],
            'pluginOptions' => [
                'allowClear' => true
            ],
        ])->label('Автор заявки'); ?>

    Сам блок на этой же странице, в котором обновляются данные пользователя (id поля, например, "newtry"):

    <div id="newtry">
            <?= $this->render('/user/_userdataview', [
                'model' => Yii::$app->user->identity,
            ]); ?>
    </div>

    А это скрипт (решил пока оставить его внизу страницы, потом можно вынести в отдельный файл), который выполняет всю данную работу:

    <?php 
    $script = <<< JS
       
    $('#useridfield').change(function(){
        $.ajax({
            type: "GET",
            url: "/basic_yii/web/user/showuserdata?user_id="+$(this).val(),
            success: function(data) {
                $("#newtry").html(data)
            }
        })
    });
            
    JS;
    $this->registerJs($script);
    ?>

    В скрипте $('#useridfield') - это id поля формы с выпадающим списком (указано в массиве options), $("#newtry") - это id специально отгороженного тегами div поля, которое полностью обновляется при клике на выпадающий список, а по адресу /basic_yii/web/user/showuserdata?user_id= лежит экшен контроллера:

    public function actionShowuserdata($user_id)
        {
            $model = \app\models\User::findIdentity($user_id);
                   
            return $this->renderPartial('_userdataview', [
                'model' => $model,
            ]);
        }


    Надеюсь, это кому-нибудь пригодится =)
    Ответ написан
    Комментировать
  • Как сделать меню для сайта как у Apple?

    uselessmindYEAH
    @uselessmindYEAH
    Frontback cocaine developer
    Делаешь у контейнера меню
    overflow-x: auto;
    overflow-y: hidden;
    Ответ написан
    1 комментарий
  • Как интегрировать PayPal?

    Sanasol
    @Sanasol Куратор тега PHP
    нельзя просто так взять и загуглить ошибку
    Комментировать
  • При запуске ubuntu открывается консоль, что делать?

    Zoominger
    @Zoominger
    System Integrator
    Вариант 1: сносить и ставить нормальную ОС.
    Вариант 2: пойдём длинным и сложным путём, который всё равно приведёт к варианту 1.
    Если выбираете вариант 2, покажите, что выведется при команде:
    startx
    Ответ написан
    7 комментариев
  • Как химику переучиться на одну из digital- профессий?

    Zoominger
    @Zoominger Куратор тега IT-образование
    System Integrator
    1. Нужно ли высшее профильное образование или достаточно моего технического?

    Достаточно никакого. Я серьёзно.

    Какие курсы или ВУЗы можете рекомендовать?

    Лично я вот противник курсов. Читайте книги или ищите персонального репетитора.

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

    Замануха для студентиков. Не встречал ни одного действительно профессионального программиста младше 25. Работаю с хорошим профи 42-х лет. На подхвате айтишница 36-ти. Девушек в IT не то, чтобы не любят, их там почти нет, вот и всё.

    Если начать работу на фрилансе, то реально потом устроиться в офис

    Фрилансеров неохотно берут в офис, а биржа фрилансеров переполнена вайтишниками.

    Я бы советовал другое направление.
    Чем IT-химия не устраивает? Есть же направления в этой сфере.
    Ответ написан
  • При запуске ubuntu открывается консоль, что делать?

    leahch
    @leahch
    3D специалист. Dолго, Dорого, Dерьмово.
    Вы наверное поставили серверный вариант системы, без графического интерфейса. Если так и задумано, то что вы хотели делать?! Если не так, то проще перставить систему в десктопной версии.
    Но можно выполнить следующую команду и допоставить desktop sudo tasksel Из появившегося списка. Да, команда попросит ввести пароль повторно.
    Ответ написан
    1 комментарий
  • Как задать уникальность поля совместно с полем из другой таблицы?

    @rPman
    Универсальный способ для любых БД и выкрутасов, что вы придумаете - создаете таблицу с полем и индексом в нужном вам формате, и заполняете ее триггером. Если фейлится индекс этой таблицы, сфейлится и запрос на изменение подчиненных таблиц, только что сообщение об ошибке будет 'не привычное'.
    Ответ написан
    2 комментария
  • Через какой платёжный сервис принимать платежи от граждан СНГ для пополнения баланса?

    Onnem
    @Onnem
    Финансовый клерк
    - если "граждане СНГ" имеется ввиду платежи с карт банков СНГ в их валюте то тут выбор не велик и, в основном, это локальные агрегаторы, типа Пэйбокс для тенге, Интеркассы для гривны, Мобильник КГ для сомов и т.п.
    - если же достаточно чтобы был сам факт процессинга и конвертация локальных валют в рубль не критична, то агрегаторов полно.
    - следующий этап эта юридическая форма, если работать как юридическое лицо вариантов выбора побольше, но ещё смотря где зарегистрированы, если как физическое то заметно меньше, но есть.

    Поэтому изначальная постановка вопроса слишком общего характера, если хотите получить точечные рекомендации.
    Ответ написан
    Комментировать
  • Через какой платёжный сервис принимать платежи от граждан СНГ для пополнения баланса?

    @plaxasox
    Если нет юрлица или ИП - выбирайте новый протокол от QIWI - https://p2p.qiwi.com/
    Нет модерации. Деньги падают на кошелек киви.
    Ответ написан
    Комментировать
  • Через какой платёжный сервис принимать платежи от граждан СНГ для пополнения баланса?

    Jump
    @Jump
    Системный администратор со стажем.
    Любой удобный.
    Для вас и для ваших целевых клиентов.
    Что именно удобно для вас, и какие у вас клиенты и что им удобно мы не в курсе.
    Ответ написан
    Комментировать
  • Как исправить ошибку?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега Python
    Седой и строгий
    У каждой платформы есть нюансы использования. В частности на бесплатном тарифе PythonAnywhere для доступа к внешним ресурсам необходимо использовать прокси. Стоит читать документацию.
    Ответ написан
    2 комментария
  • Где можно достать бесплатный макет на фигме, для обучения вёрстке?

    SmthTo
    @SmthTo Куратор тега Вёрстка
    Все перепёлки мира будут оплакивать мою смерть.
    https://www.figmafreebies.com/

    Поиск в Google:
    Free Figma templates
    Figma freebies
    Ответ написан
    Комментировать
  • Узнать что другое окно закрыли?

    @LEXA_JA
    Ответ написан
    Комментировать
  • Как блокируется поток?

    sim3x
    @sim3x
    хттп - стейтлес протокол
    Браузер запросил у nginx страницу - получил ее

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

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

    В вашем случае при дефолтных таймерах у пользователя будет стоять минимум 20секунд белая страница и будет указано, что браузер ждет ответа сервера
    Ответ написан
    Комментировать
  • Стоит ли переходить с var на let и const?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Нужно использовать и то, и другое одновременно, в зависимости от обстоятельств.

    Например, если вы используете Google Script, то var, потому что там что-то типа ES5.
    Если шлёте код другу, чтобы он проверил его через консоль браузера, то опять var, потому что если что-то поменяется и надо будет ещё раз проверить, то он запустится без ошибок (о том, что переменная уже объявлена).

    С другой стороны, в одном пространстве (например, внутри функции) вы можете использовать несколько одинаковых переменных с помощью let на разных уровнях, и не бояться конфликтов, в то время как через var будет одна и та же переменная. Пример:
    for(let i=0;i<2;i++)for(let i=0;i<2;i++)console.log(i); //покажет 4 раза
    for(var i=0;i<2;i++)for(var i=0;i<2;i++)console.log(i); //покажет 2 раза

    Каждое имеет свои особенности и удобно по-своему.
    Ответ написан
    9 комментариев