• Программирование деформирует человека как личность?

    Robur
    @Robur
    Знаю больше чем это необходимо
    Программирование деформирует человека как личность?


    Нет.

    У кого такое было? Как с этим справиться?

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

    @Interface
    Как начать разрабатывать игры или написать свой игровой движок?

    Создайте папку в любом удобном для вас месте на компьютере с названием "мой игровой" движок, по желанию можно еще туда положить readme файлик. Готово - вы начали писать движок. Теперь нужно двигаться к его завершению. По мере движения у вас появится множество новых более конкретных вопросов, на которые уже проще будет найти конкретный ответ.

    Несложно представить игровой движок для написания которого не нужно знать физику абсолютно. (движок для крестиков-ноликов, кроссвордов, судоку, текстовых квестов или уже серьезный движок для игр в стиле Diablo, Fallout (1-2-T) и т.д.).

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

    Довольно ожидаемо, что если под своим движком вы подразумеваете продукт уровня UE, Unity или чего-то отдаленно сопоставимого, или даже простейший 3д движок написанный с нуля, то остается пожелать вам удачи.

    Я бы советовал начать с практики, то есть начать его постепенно писать, понимая, что через месяц/год все придется выкинуть и (опционально) начать с нуля. А там уже сформируются конкретные вопросы и теория будет ложиться лучше на фундамент проб и ошибок.
    Ответ написан
    Комментировать
  • Как реализовать правильную архитектуру кода?

    SilenceOfWinter
    @SilenceOfWinter
    та еще зажигалка...
    Комментировать
  • Как изучать С# после С++, и стоит ли вообще?

    @Mercury13
    Программист на «си с крестами» и не только
    Вы просто изучаете Си с диезом, и всё, что узнаёте по этому языку, прикладываете к вашим знаниям Си с крестами.

    > С++, С# или все вместе?
    По минимуму желательно освоить оба языка, а вот рисунок кода, инструментарий и прочее — по Си# подтянуть хвосты будет как-то проще.

    > Если С# то учить с нуля?
    Вы уже не ноль, и курс, где вас будут просить решить квадратное уравнение в консоли, может поначалу для вас оказаться тратой времени. Но это уже зависит от ваших знаний — видимо, у вас их не так много и потери будут невелики.

    > Если С++, то что учить дальше кроме ООП?
    Строить живые проекты. Qt (хоть в простейшем виде). SDL (хоть в простейшем виде, раз уж вы геймдевщик). Какой-нибудь игровой движок (Unreal или Godot), но это уже серьёзно.

    > Есть ли что-то что повысит мои шансы попасть в геймдев?
    Трёхмерная математика. Кватернион единичной длины как замена матрице поворота в 3D. Обработка изображений и звука, хоть простейшая. «Programmer’s art» вроде шейдеров и систем частиц. Умение программировать трёхмерные игры на готовом движке хоть в простейшем варианте. Умение написать своими силами (на тонкой обёртке вроде SDL) хотя бы «Элиту».
    Ответ написан
    Комментировать
  • Как сделать иерархию классов?

    @majstar_Zubr
    C++, C#, gamedev
    Поднимите свойство в класс-родитель.
    Сделайте виртуальные методы в родителе bool Damage( int damagPoints ), bool Heal (int healthPoints).

    Зафиксируйте инварианты в родителе: отрицательного здоровья не может быть, отрицательный урон наносить нельзя, отрицательные лечение делать нельзя, выше максимального передела шакала здоровья быть не может.

    Если хотите сделать некоторых конкретных Enemy с особыми свойствами, то сделайте реализации инвариантов также виртуальными. Допустим Slug получает 50% урона и только чётный урон.

    Тогда например Slug:

    new public bool Damage( int damagePoints )
    {
        if (isDamageAcceptable(damagePoints))
        {
            int appliedDamage = Math.Ceiling(damagePoints/2);
            TakeDamage(appliedDamage);
        }
        return isDamageAcceptable(damagePoints);
    }
    
     new protected bool isDamageAcceptable( int damagePoints) => (damagePoints > 0) && (0==damagePoints%2) );


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

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

    Если речь о том, что у не у всех задуманных Enemy может быть здоровье, то вам нужно либо менять модель отношения классов и пересмотреть абстракции, либо использовать композицию вместо наследования.
    Ответ написан
    Комментировать
  • Как сделать иерархию классов?

    tsarevfs
    @tsarevfs
    C++ developer
    Почему бы не перенести HP в класс Enemy?
    Ответ написан
    1 комментарий
  • Как выбрать структуру 2d программы?

    Adamos
    @Adamos
    Я создал класс объектов, (например теплообменник) он имеет свойства на основании которых производится расчёт (например КПД) . И свойства на основании которых происходит отрисовака ( например положение при отображение (коардинаты x, y)) не уверен, что я сделал корректно.

    Создаете абстрактный класс "элемент расчета" с общим для всех элементов интерфейсом. Создаете базовый класс "графический элемент" с общим интерфейсом рисования.
    Создаете класс "элемент рисования", свойства которого - координаты и ссылки на элемент расчета и соответствующий ему графический элемент.
    Отрисовщик имеет массив элементов рисования, обходит их и один за другим отрисовывает, вызывая нужные функции графического элемента, который может обратиться за параметрами к элементу расчета. Важно, что элемент расчета ничего не знает ни о каком рисовании, а графический элемент знает не больше, чем нужно для отрисовки именно его картинки.
    Все элементы расчета и рисования представлены в виде классов-наследников тех абстрактных классов и обрабатываются единообразно - отрисовщик вообще не видит между ними различий, они убраны в класс графического элемента.
    Примерно так...
    Ответ написан
    2 комментария
  • Работа с Excel в C#?

    @stictt
    просто рак
    подгрузить библиотеку для работы с экселем вроде Excel.Application или как то так, указываешь путь к книги/файл, указываешь лист, читаешь ячейку. list.cells[1,1].value или как то так
    Ответ написан
    Комментировать
  • Как DI резолвится в .ctor'е контроллера?

    @lil_Toady
    Не очень понятен вопрос.
    Если про то как DI понимает какую имплементацию использовать - все просто, вы сами ее и указываете для конкретного интерфейса.
    А если вам интересно как DI понимает что передать в конструктор: через рефлексию, в Type есть метод GetConstructors() - получить список ConstructorInfo, описывающих каждый из задекларированных конструкторов. Далее можно получить список параметров (ParameterInfo) через GetParameters() и найти тот, все типы параметров которого известны DI, инстанциировать их и затем уже инстациировать запрошеный класс, как например контроллер, используя, например, Activator.CreateInstance куда передается тип нужного нам класса и список аргументов.
    Ответ написан
    2 комментария
  • Каким должно быть портфолио для человека без фриланс опыта?

    Robur
    @Robur
    Знаю больше чем это необходимо
    Показываете в профиле опыт работы. Пишете что вообще то вы слишком круты для фриланса, и так серьезной работы хватало но хотите попробовать чего-то нового. Ну или еще что-то, что даст понять что вы не очередной золотокопатель освоивший пару курсов по программированию.
    Если позволяет текущий контракт - пару скриншотов проектов в которых участвовали, желательно самых навороченных на вид. Дольше 5 секунд никто на них все равно смотреть не будет.

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

    Для начала нужно будет плотно помониторить фид чтобы поймать нормальные проекты. Какие нормальные - ваше чутье должно вам подсказать, если "срочно вчера клон гугла за $100" то это конечно нет.
    Ответ написан
    Комментировать
  • Нескучная математика - такое бывает?

    Zoominger
    @Zoominger Куратор тега IT-образование
    System Integrator
    Читайте Перельмана штоль тогда.
    Якова, конечно.
    Ответ написан
    1 комментарий
  • Что учить дальше после основ C#?

    @Free_ze
    Пишу комментарии в комментарии, а не в ответы
    Базы данных и СУБД, архитектурные паттерны, платформу .NET вглубь. Дальше - в зависимости от интересующей специфики.
    Ответ написан
    Комментировать
  • Что прописать нужно чтобы файл html автоматически чистилcя в кэше браузера и показывал последние изменения?

    ThunderCat
    @ThunderCat
    {PHP, MySql, HTML, JS, CSS} developer
    клиент как только обновит страницу, у него больше не показывалась старая информация, а показывалась новая.

    Неправильный ответ - прописать заголовки кеширования на короткое время, магия, чистка кэша и вот это все

    Правильный ответ - не использовать файлы с одинаковыми именами для динамически меняющегося контента.
    Поясню: файлы js, css, изображения и прочие элементы дизайна и функционала должны кешироваться, они не являются динамической информацией и не должны часто меняться. Отключать кеширование для них - глупо и чаще всего бесполезно(вы же не храните прайс в js файле надеюсь?). Информация же динамическая (в вашем случае прайс) либо в виде текста лежит(что вообще не кешируется по умолчанию), либо лежит у вас в виде файла типа price.xls. И вот во втором случае уже будут проблемы. И тут есть 2 нормальных решения: первое - делать уникальные имена для прайсов(например добавлять дату изменения, что логично и удобно как вам так и клиенту), либо после ссылки на файл добавлять уникальный гет параметр, в итоге ссылка файла будет выглядеть как price.xls?date=220519. Тоже приемлемый вариант, но уникальное имя лучше/удобнее.
    Ответ написан
  • С чего начать изучать game dev?

    @nrgian
    Если знаешь, как ты пишешь, языки, то сделай для начала парочку простых игр.
    Типа Змейки. Это очень просто https://dart.academy/web-games-with-dart-and-the-h...
    Потом перейди на Пэкмена, там логику преследователей писать будет непросто.
    И т.д.
    Ответ написан
    2 комментария
  • Версионирование данных в базе?

    zoonman
    @zoonman
    CEO @ LinuxQuestions.ru
    Если у вас в таблице 500к записей, то нет абсолютно никакого смысла скачивать ее всю на телефон за исключением одной ситуации - режима работы оффлайн. В данном случае просто делается актуальный слепок, архивируется и отправляется к клиенту. Скачать 100 МБ с телефона сейчас не проблема. При наличии интернета гораздо проще делать запросы через API.

    Если подобный вариант не устраивает, то делается все очень просто - на сервере данные никогда не удаляются, но хранится признак их удаления. Помимо этого признака хранится признак последнего обновления записи.
    На клиенте хранятся специальные мета-данные с информацией о последнем обновлении (timestamp).
    При подключении клиент запрашивает обновление со временем последнего обновления и локальным временем (видел неправильно настроенные часы миллион раз), сервер отвечает обновленными данными. Для сохранения трафика данные приходят в сжатом формате, а удаленные записи передаются отдельным фрагментом с минимальной идентфицирующей строки информацией (поля: первичный ключ или уникальный индекс). Это обеспечивает минимальный объем трафика, но работает только в одну сторону.

    Для работы в обе стороны нужен полный лог операций и система разрешения конфликтов. В целом решение так себе, для баз работающих с большим рассинхроном или высокой частотой обнолений, не решается (OT не спасет) без участия человека.

    Для обычных баз данных в режиме совместной работы настраивайте мастер-мастер репликацию с транзакциями. Для мобильных приложений используйте режим тонкого клиента.
    Ответ написан
    2 комментария
  • Версионирование данных в базе?

    @VasyaM13221
    1) клиент хранит дату последней репликации с сервером.
    2) сервер при каждом обновлении строки обновляет столбец changetAt у строки.
    3) клиент при подключении отправляет на сервер дату своей последней репликации с сервером.
    4) сервер делает выборку по дате и отправляет id строк клиенту
    5) клиент смотрит какие id ему нужны и делает запрос на их обновление
    Ответ написан
    Комментировать
  • Какой алгоритм текстового калькулятора лучше?

    tumbler
    @tumbler
    бекенд-разработчик на python
    Добро пожаловать в мир конструирования компиляторов :)
    Если кратко и просто, то основные стадии работы компилятора такие:
    1. Лексический анализ (разделение строки на лексемы - числа и операции)
    2. Синтаксический анализ (скобки, приоритет операций - в общем, перевод потока лексем во внутреннее представление
    3. Дальше уже не компилятор а интерпретатор начинается: вычисление значений выражений.

    Так вот, первый вариант - это в минимальном приближении "грамотный" интерпретатор, второй вариант - строковый "костыль", который тяжело отлаживать, поддерживать и расширять.
    Есть и другие подходящие альтернативы: воспользоваться существующими библиотеками для DSL (примером которых является задача вычисления математических выражений), либо написать свою грамматику и воспользоваться готовыми решениями лексического и синтаксического анализа.
    Ответ написан
    Комментировать
  • Как поменять цвет заднего фона у активного TabItem?

    cyber_roach
    @cyber_roach
    UX дизайнер INEDIapps
    Все логично.
    Вы же не поменяли цвет состояний (over select и пр...)

    WPF не про смену цвета элемента через базовые свойства элемента.
    WPF это про стили и язык разметки интерфейса (XAML)

    В базовом виде стили выглядят как-то так:
    (можете просто скопировать всё на любую форму в проекте и заработает)

    <Grid>
            <Grid.Resources>
                <ResourceDictionary>
                    <Style  TargetType="{x:Type TabItem}">
                        <Setter Property="OverridesDefaultStyle" Value="True"/>
                        <Setter Property="SnapsToDevicePixels" Value="True"/>
                        <Setter Property="Foreground" Value="White"/>
                        <Setter Property="Background" Value="#FF7C0000"/>
                        <Setter Property="BorderBrush" Value="Black"/>
                        <Setter Property="Height" Value="32"/>
                        <Setter Property="Template">
                            <Setter.Value>
                                <ControlTemplate TargetType="{x:Type TabItem}">
                                    <Border x:Name="Border" Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="1" Margin="0,0,-1,0">
                                        <Grid >
                                            <Rectangle x:Name="interactive" Opacity="0.3"/>
                                            <ContentPresenter HorizontalAlignment="Center" Margin="12,2,12,2" x:Name="ContentSite" VerticalAlignment="Center" RecognizesAccessKey="True" ContentSource="Header" />
                                        </Grid>
                                    </Border>
                                    <ControlTemplate.Triggers>
                                        <Trigger Property="IsSelected" Value="True">
                                            <Setter Property="Panel.ZIndex" Value="100"/>
                                            <Setter Property="Background" Value="Black" />
                                        </Trigger>
                                        <MultiTrigger>
                                            <MultiTrigger.Conditions>
                                                <Condition Property="IsMouseOver" Value="True"/>
                                                <Condition Property="Selector.IsSelected" Value="False"/>
                                            </MultiTrigger.Conditions>
                                            <Setter Property="Fill" Value="Black" TargetName="interactive"/>
                                        </MultiTrigger>
                                        <Trigger Property="IsEnabled" Value="False">
                                            <Setter Property="Opacity" Value="0.5" TargetName="interactive" />
                                            <Setter Property="Fill" Value="Black" TargetName="interactive" />
                                            <Setter Property="Background" Value="White"/>
                                            <Setter Property="Foreground" Value="DarkGray"/>
                                        </Trigger>
                                    </ControlTemplate.Triggers>
                                </ControlTemplate>
                            </Setter.Value>
                        </Setter>
                    </Style>
                    <Style TargetType="{x:Type TabControl}">
                        <Setter Property="Background" Value="Black"/>
                        <Setter Property="Template">
                            <Setter.Value>
                                <ControlTemplate TargetType="{x:Type TabControl}">
                                    <Grid KeyboardNavigation.TabNavigation="Local">
                                        <Grid.RowDefinitions>
                                            <RowDefinition Height="Auto"/>
                                            <RowDefinition Height="*"/>
                                        </Grid.RowDefinitions>
                                        <TabPanel Grid.Row="0" IsItemsHost="True" Panel.ZIndex="1" KeyboardNavigation.TabIndex="1"/>
                                        <Border Padding="12" Background="{TemplateBinding Background}"
                                                    Grid.Row="1"  KeyboardNavigation.DirectionalNavigation="Contained" KeyboardNavigation.TabNavigation="Local" KeyboardNavigation.TabIndex="2">
                                            <ContentPresenter x:Name="PART_SelectedContentHost" ContentSource="SelectedContent"/>
                                        </Border>
                                    </Grid>
                                </ControlTemplate>
                            </Setter.Value>
                        </Setter>
                    </Style>
                </ResourceDictionary>
            </Grid.Resources>
            
            <TabControl Margin="10" >
                <TabItem Header="Файловая система">
                        <TextBlock>Вкладка 1</TextBlock>
                </TabItem>
                <TabItem Header="Еще одна система">
                        <TextBlock> Вкладка 2</TextBlock>
                </TabItem>
                <TabItem Header="Мегасистема">
                        <TextBlock> Вкладка 3</TextBlock>
                </TabItem>
                <TabItem Header="Суперсистема" IsEnabled="False">
                        <TextBlock> Вкладка в дисабле</TextBlock>
                </TabItem>
            </TabControl>
        </Grid>


    В данном примере я определил стили внутри Grid
    Это значит все таб-контролы внутри этого грида будут использовать этот внешний вид.
    Можно так же определить стиль на уровне окна или на уровне приложения (в App.xaml)
    Можно именовать стили (без имени = по умолчанию)

    Выглядит живьем все вот так:
    cuzfqh6sokmhzyh2opaumtxfpa8.png

    Соответственно после того как стиль есть, уже можно переопределить в нем базовые свойства как надо через Setter'ы

    Данная строка задает переопределение всех свойств базового стиля (ну или можно их все вручную переписать):
    <Setter Property="OverridesDefaultStyle" Value="True"/>


    А это чтобы по пикселям выровнять:
    <Setter Property="SnapsToDevicePixels" Value="True"/>


    Таким способом можно связывать отдельный компонент внутри стиля с базовым свойством:
    Background="{TemplateBinding Background}"

    А этот компонент я добавил как пример :
    <Rectangle x:Name="interactive" Opacity="0.3"/>
    Показать что интерактивные состояния можно как угодно реализовывать и что структура компонента может быть различной. (где -то у загажнике у меня валяется Tab-Control в виде круга (как у железного человека прям с радиальной расстановкой tabItem'ов)

    с помощью Trigger'ов можно делать ракцию изменений свойств.
    Также специально сделал Овер мыши через мультитриггер, для понимания как такие использовать.
    Можно сюда еще анимации добавлять.
    А можно вообще без тригеров через VisualState добавлять интерактив, принципы схожи.

    Грамотное применение стилей дает возможность не перегружать верстку страниц, визуал, отсупы, сетка все автоматом подтаскивается, что видно в самом конце кода, сами табы оформлены по минималу
    Ответ написан
  • Можно ли в Windows Form разместить один элемент в собственном потоке?

    petermzg
    @petermzg
    Самый лучший программист
    Вычисления отдельно, анимация отдельно.
    1. Показали контрол с анимацией в UI потоке
    2. Запустили поток с вычислениями.
    3. Вычисления завершились, сообщили в UI поток.
    4. Скрыли/удалили анимацию
    Ответ написан
    Комментировать
  • Что с точностью float?

    Griboks
    @Griboks Куратор тега C#
    1. Исходные данные вы вводили с точностью до сотых. Ответ получили верный с точностью до сотых. Никаких проблем нет. Пример некорректен.
    2. Точность (количество знаков) фиксирована. Проблема, как вам уже написали, в системе счисления. Если вам надо считать в десятичной системе, используйте специализированные для этого типы. Компьютер вычисляет float без ошибок. Ошибки возникают при кодировании результата в "читаемый" вид и наоборот.
    Ответ написан
    Комментировать