Задать вопрос
  • C#. Операторы доступа для сокрытия, но не для защиты?

    @Sing303
    Инкапсуляция позволяет повысить надёжность программы и делает код более самодокументированным.

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

    Не понятно, почему вы не хотите следовать инкапсуляции в своих проектах, разве это добавляет сложности?
    Ответ написан
    1 комментарий
  • C#. Операторы доступа для сокрытия, но не для защиты?

    Предствим следующу ситуацию:

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

    Эм.. как вы считаете, захочется ли комуто отвечать этому человеку всерёз?

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

    По сути вопроса:
    Заморачиватся над этим необходимо, поскольку это существенно упрощает жизнь вам и остальным. При помощи модификаторов вы должны описать, то как необходимо пользоватся вашим классом, защитить его от не желательного вмешательства и кривых рук. То что все это можно поламать при помощи рефлексии не значит, что на это стоит просто забить... Рефлексия это тоже инструмент призваный помочь в решении определеного круга задач и то как его использовать напрямую зависит от разработчика...
    Ответ написан
    2 комментария
  • Как использовать паттерн Repository и UnitOfWork?

    @BaranovskiyNE
    Да, репозитарий скрывает в себе логику выборки данных из БД, предоставляя методы типа GetActiveAccounts, GetAccountByID и т.п. По мне так отдельно использовать можно, но если у Вас идет модификация данных различных сущностей и она должна происходить в рамках одной транзакции - тут уж никуда не денешься от UnitOfWork. По поводу CRUD операций - получается репозитарий выполняет манипуляции с данными, а UnitOfWork следит за тем, что бы это все прошло единой транзакцией.
    Ответ написан
    Комментировать
  • С#. Почему нужно прописывать using System.ChildNamespace, когда уже указано using System?

    yarosroman
    @yarosroman Куратор тега C#
    C# the best
    Не должно, это логически разные зоны видимости. Плюсом в разных namespace могут находится классы с одинаковыми именами, тут у вас компилятор сойдет с ума, и на каждое упоминание класса вам надо делать будет уточнение в виде полного имени.
    Ответ написан
    Комментировать
  • MVVM с ним или без него?

    @i_light
    Backend, XAML, crossplatform
    Всегда использовать. Просто - всегда. WPF изначально разработан под связывание и нормальную архитектуру.

    То, что можно делать так же, как в WinForms, не говорит о том, что это стоит делать.

    Просто запомнить как мантру, создал проект - добавь референс на MVVM фреймворк, и работай. Фреймворк любой, например MVVMLight. Или Prism. Или свой велосипед (я так делаю), любой.
    Ответ написан
    Комментировать
  • MVVM с ним или без него?

    @SZolotov
    Asp.net core, MAUI,WPF,Qt, Avalonia
    C MVVM проще и в больших и в маленьких проектах
    Ответ написан
    2 комментария
  • Чем отличается onion-architecture от n-layer-architecture?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    n-layered архитектура - это просто архитектура построенное на рандомном количестве слоев. оно определяет базовые принципы разделения ответственности и все такое, но на этом все.

    onion - тут уже идет уточнение, что мол в самом сердце у нас core-domain, сущности, базовые бизнес правила. От него уже идет дальше domain layer, application layer и т.д. То есть сначала мы проектируем core-domain а потом уже все остальное.

    Есть еще гексагональная - это опять же уточнения для n-layered архитектур, что мол каждый слой отделен друг от друга за счет dependency inversion. На границах слоев всегда есть интерфейсы, а у внешнего слоя - реализация. Потому ее называют "архитектура портов и адаптеров".
    Ответ написан
    2 комментария
  • Есть ли смысл покрывать тестами контроллер?

    @SMA2
    Зависит от степени твоей лени, степени ответственности заказа и объема оплаты.
    Ответ написан
    Комментировать
  • Есть ли смысл покрывать тестами контроллер?

    Да, в контроллерах тоже же есть код, который нуждается в покрытии тестами.
    Ответ написан
    Комментировать
  • На что ругается, не пойму?

    petermzg
    @petermzg
    Самый лучший программист
    Ругается на строку. Сроки выделяются символом ( " ). И еще нужно будет удвоить ( \ )
    Ответ написан
    Комментировать
  • Как посчитать до какого значения заполнен массив по каждому из измерений?

    @carbon88
    .NET developer/ORM developer
    Пробежаться по массиву и проверить что там заполнено. Тут есть два варианта, бежать сначала и искать первый незаполненный или бежать с конца и искать первый заполненный. выбирайте стратегию сами.
    Тут еще вопрос каким образом идет запись - рандомно, в любую клетку так сказать, или последовательно.
    Если рандомно, то скорее всего нужно брать вариант просмотра с конца. Если последовательно, то тут вообще можно без обхода обойтись, запоминая максимальный индекс(ы) по которому(ым) произвелась запись.
    Ответ написан
    Комментировать
  • Какие технологии к уже изучаемым нужно добрать, чтобы считаться web full stack разработчиком?

    riky
    @riky
    Laravel
    Но все равно чувствую, что чего-то не хватает

    не хватает видимо летных часов опыта чтобы во всем этом уверенно себя чувствовать.
    могу рекомендовать написать какой нибудь проектик.
    Ответ написан
    3 комментария
  • Где в Symfony 2 хранить пользовательские функции?

    BoShurik
    @BoShurik Куратор тега Symfony
    Symfony developer
    • Создать SiteController::breadcrubsAction и вызывать его в шаблоне с помощью
      {{ render(controller('AppBundle:Site:breadcrubs')) }}

    • Создать Extension для Twig и вызывать его в шаблоне с помощь, к примеру, {{ breadcrumbs() }}

    И, как правильно сказал Doc, логику создания хлебных крошек, по хорошему, надо держать в сервисе, а в контроллере или экстеншене - только его дергать.
    В качестве готового решения, если интересует, можете посмотреть в сторону KnpMenuBundle
    Ответ написан
    Комментировать
  • Где в Symfony 2 хранить пользовательские функции?

    sayber
    @sayber
    Да, я программирую на PHP и еще асинхронно!
    https://symfony.com/doc/master/book/service_contai...

    Вам надо использовать сервисы.
    Ответ написан
    Комментировать
  • Нужно ли на каждый task создавать CancellationToken?

    @MonkAlex
    C#, SQL, Delphi, C++ etc
    Ээээ и отменять абсолютно все таски одним токеном? Если вас это устроит - можно.
    Ответ написан
    Комментировать
  • Как правильно обрабатывать ошибки в C#?

    Nipheris
    @Nipheris Куратор тега C#
    Т.е. нужна некая философия

    А какие книги вы уже пробовали читать, раз такое спрашиваете?

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

    Все это дает вам набор простых правил:
    1) выбрасывать исключение нужно тогда, когда вы не собираетесь обрабатывать возникшую ситуацию в рамках текущего алгоритма. Иными словами, для работающей в данный момент функции эта ситуация - "исключительная". Пример: вы пишете функцию для чтения GIF-файла в Bitmap, и по ходу чтения проверяете соответствие получаемых данных формату GIF-файлов (например, убеждаетесь в наличии GIF89a в начале файла). Если вдруг вы видите, что формат файла нарушен, то вам ничего не остается кроме как выбросить исключение, т.к. вы не можете продолжить выполнение основного алгоритма - считывание файла. Внутри функции считывания вы не знаете заранее, как вызывающий код захочет обработать эту проблему, вам и не нужно это знать;
    2) перехватывать исключение конкретного типа нужно тогда, когда в задачу текущего кода входит и обработка ошибок тоже. Иными словами тогда, когда исключение в вызванном коде - лишь один из вариантов нормальной работы вызывающего кода. Вернемся к примеру с GIFками: если для библиотечной функции чтения файла нарушение формата - это критическая проблема, то для вызывающего эту функцию GUI-приложения это нормальная ситуация - ее можно и нужно обработать, выдав пользователю соответствующее сообщение, или просто пропустить файл, если обрабатывается сразу несколько картинок. Или например, если вы пишете веб-сервис, вы врядли хотите, чтобы весь сервис прекратил работу из-за ошибки при обработке какого-то одного запроса. Поэтому в веб-сервере, раздающем файлы вы, к примеру, можете перехватывать все FileNotFound исключения, и выдывать ошибку 404, а на все остальные исключения внутри обработчика запроса - ошибку 500 и в обоих случаях писать в error.log.

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

    Отличный пример разных подходов - методы Parse/TryParse у числовых типов в дотнете. Первый возвращает значение и выбрасывает исключение, второй записывает значение через выходной параметр, возвращает bool и НЕ выбрасывает исключение. "Try" в названии второго метода подчеркивает, что для этого метода неудача при попытке распарсить число из строки - НОРМАЛЬНАЯ ситуация, и метод в этом случае вернет false. Для метода Parse напротив, такая ситуация будет исключительной, т.к. ему просто-напросто нечего будет возвращать, и дальнейшая нормальная работа кода, в том числе вызывающего, невозможна.
    Поэтому метода TryParse чаще используют тогда, когда вероятность ошибки высока и ее обработка - одна из ветвей алгоритма. Например при считывании пользовательского ввода мы сразу можем попросить пользователя исправить введенное значение.
    С другой стороны, Parse применяется если ошибка маловероятна, мы не готовы ее обработать и лучше прервать всю операцию целиком. Например если мы получили от сервера невалидный ответ, мы не попросим его исправить этот ответ. Дальнейшее общение с сервером лучше прервать, т.к. имеет место нарушение протокола и можно наломать дров.
    Ответ написан
    Комментировать
  • Node.js как замена PHP?

    akubintsev
    @akubintsev
    Опытный backend разработчик
    Я бы на вашем месте задумался кому вы сможете продать свои знания с этим node.js
    Node.js я бы не стал рассматривать как альтернативу php в реальном мире. У него есть своя небольшая ниша под узкий круг задач. Который, кстати, Go успешно покрывает с лихвой и даже больше.
    Ответ написан
    8 комментариев
  • С#. Почему локальным переменным, определенным в методе, необходимо задавать начальное значение, а полям класса можно не задавать?

    BasmanovDaniil
    @BasmanovDaniil
    Геймдизайнер-телепат
    И там и там можно не задавать, нужно понимать что вы хотите сделать.
    using System;
    
    public class Test<T>
    {
        // Перед вызовом конструктора выставится в default(int), то есть 0 
        private int i;
    
        // Для ссылочного типа default(object) будет null
        private object obj;
    
        // default(T)
        private T t;
    
        public Test()
        {
            // Не инициализированная переменная
            int foo;
    
            // error CS0165: Use of unassigned local variable 'foo'
            Console.WriteLine(foo.ToString());
    
            foo = 0;
    
            // У foo появилось значение, теперь переменной можно пользоваться
            Console.WriteLine(foo.ToString());
    
            int bar;
    
            // error CS0165: Use of unassigned local variable 'bar'
            Ref(ref bar);
    
            // Для ref нужна инициализированная переменная
            Ref(ref foo);
    
            // Для out не нужна
            Out(out foo);
            Out(out bar);
        }
    
        private void Ref(ref int r)
        {
            r = 0;
        }
    
        private void Out(out int o)
        {
            o = 0;
        }
    }

    Подробнее читайте в MSDN здесь и здесь.
    Ответ написан
    Комментировать
  • Как на лету добавлять столбцы в базу данных?

    @dmitryKovalskiy
    программист средней руки
    А что вы понимаете под "на лету"? Реакция на некое действие пользователя? Для 99,9% случаев - такое поведение не нужно. Нужно чуть чуть пересмотреть задачу и сделать без добавки столбцов. БД - вещь в высокой степени статичная должна быть. Исходя из этого можно заниматься ее оптимизацией работы.

    Ну а если вы хотите накатывать обновления без остановки приложения, то банального ALTER TABLE вам должно хватить.
    Ответ написан
    2 комментария