GithubHelp home page GithubHelp logo

pix-conventions's Introduction

Соглашение и рекомендации при разработке роботов на PIX

В этой статье

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

Соглашение о структуре проекта

Разделение проекта на слои Разбиение этого проекта на несколько слоев на основе обязанностей позволяет повысить удобство поддержки проекта
├───Common (слой шаблонов и прочих файлов)
├───Helpers (слой независимых функций)
├───Infrastructure (слой работы с сервисами/интеграциями)
│   ├───DataBase (работа с бд)
│   ├───Mail (работа с почтой)
│   └───PIX Master API (работа с API мастера)
├───States (слой состояний)
│   ├───Init
│   │   └───Transactions
│   ├───GetSetTransaction
│   │   └───Transactions
│   ├───Process
│   │   └───Transactions
│   └───EndProcess
└───Tests (слой тестов)
    ├───IntegrationTests
    └───UnitTests

⬆ К началу статьи

Используйте шаблон на основе State Machine

Список шаблонов

⬆ К началу статьи

Соглашение об именовании

Используйте PascalCasing Используйте регистр pascal (”PascalCasing”) и префиксы in, out, io при именовании параметров скрипта

⬆ К началу статьи

Используйте camelCasing Используйте регистр camel (”camelCasing”) при именовании переменных в скриптах

camelCasing

⬆ К началу статьи

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

⬆ К началу статьи

Наименование должно отражать значение Переменная — это какие-то данные, какое-то значение, но не стоит её так и называть. Конкретизируйте. Что за значение мы хотим в ней хранить? Так и назовём переменную.

domainName

⬆ К началу статьи

Не используйте несколько вариантов для одного термина Можно встретить варианты нейминга одних и тех же терминов, поэтому лучше обговаривать найминг или вести глоссарий

Примеры:

Поставщик: provider, supplier, vendor, contractor -> suplier
Заказчик: customer, client, consumer -> customer
Цена: price, rate, cost, pricing, worth -> price
Объем: volume, amount, size, bulk, quantity -> volume
Склад: warehouse, storage, store, storehouse -> storehouse

⬆ К началу статьи

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

ruCharts

⬆ К началу статьи

Не используйте венгерских обозначений Венгерская нотация повторяет тип, который уже присутствует в объявлении. Это бессмысленно, поскольку PIX Studio идентифицируют тип.

FixHungarianNotation

⬆ К началу статьи

Не используйте избыточных названий В название добавляется тип переменной или избыточный префикс названия объекта. В итоге мы читаем код как «добавлено дата время» или «корзина — айди корзины».

Context

⬆ К началу статьи

Не используйте названия без контекста Только благодаря значениям мы поняли, что за source имеется в виду, в каком смысле употреблены state, status. Без значений всё усложняется — придётся отвлекаться и уточнять, о чём идёт речь.

NotContext

⬆ К началу статьи

Не используйте абстрактные названия По названию свойств сложно догадаться, о чём идёт речь. Почему бы не назвать свойства именем метрики, которую они несут? Не нужно придумывать лишние обозначения, которые не применяются в реальной жизни.

Например: переменная checkAttachments - абстрактное название, если дословно переводить получится "проверка вложений", из названия не понятно что переменная возвращает при наличие или отсутствие вложений. Лучше назвать isWithAttachments или isAttchaments, и нам сразу будет понятно что при наличии вложений будет возвращать true

Abstract

⬆ К началу статьи

Избегайте отрицательных переменных Отрицательные переменные сложные в понимании, а если в коде есть не отрицательные переменные, то легко запутаться

NotVariables

⬆ К началу статьи

Cоглашение о БД

Используйте Bulk запросы При записи больших таблиц используйте bulk запросы, вместо циклов

  • достаточно одного запроса в БД
  • быстреее чем простые запросы
Кол-во записей Обычный запрос (Insert) Bulk-запрос (bulk insert)
100 2 мс 1,9 мс
1 000 18 мс 8 мс
10 000 203 мс 76 мс
100 000 2,13 с 742 мс
1 000 000 21,56 с 8,3 с

Тестовая таблица содержит 6 столбцов (Guid, string x2, int, decimal?, DateTime).

Тест проводился локально по конфигурации:

  • CPU INTEL i7-10510U с частотой 2,30 ГГц
  • RAM DDR3 16 ГБ
  • SSD SAMSUNG 512 ГБ

⬆ К началу статьи

Выборку данных реализуйте в SQL запросах, а не в активностях
  • уменьшает потребление памяти (не надо тянуть всю таблицу в оперативку)
  • увеличивает производительность

⬆ К началу статьи

Избегайте создание хранимок в БД
  • уменьшает кол-во зависимостей (не надо поддерживать хранимки)
  • увеличивает гибкость настройки робота
  • упрощает поддержку скриптов

⬆ К началу статьи

Учитывайте различия между NULL и пустой строкой При работе с БД, учитывайте различия между null и '', если значения нет то указывайте null. Но если значение должно быть пустое (например результат распознавания вернул пустую строку) то в БД пишем ''

⬆ К началу статьи

Соглашение об очередях

  • Элементы очереди обновляйте в последнею очередь

⬆ К началу статьи

Соглашение о логировании

  • Логируйте прогресс обработки больших данных в % или 0/100
  • Логируйте все вложенные ошибки, но избегайте логирование всего трейса исключений в транзакции
  • Логируйте исключения добавляя данные об транзакции (не конфиденциальные)
  • Избегайте логирование конфиденциальной информации
  • Избегайте логирование начало/конца скрипта

⬆ К началу статьи

Соглашение об исключениях

Не генерируйте исключения повторно

// В работе

⬆ К началу статьи

Обработка общих условий без выдачи исключений

// В работе

⬆ К началу статьи

Не используйте Try/Cath/Finaly в бизнес логике

// В работе

⬆ К началу статьи

Не создавайте в Cath

// В работе

⬆ К началу статьи

Рекомендации по написанию скриптов

Соблюдайте соглашение о коде C#

Стандарт кода необходим для поддержания удобочитаемости кода, согласованности и совместной работы в команде разработчиков. Код, который соответствует отраслевым методикам и установленным рекомендациям, проще понимать, поддерживать и расширять. Большинство проектов применяют согласованный стиль с помощью соглашений о коде. И dotnet/docsdotnet/samples проекты не являются исключением. В этой серии статей вы узнаете о наших соглашениях по программированию и средствах, которые мы используем для их применения. Вы можете принять наши соглашения как есть или изменить их в соответствии с потребностями вашей команды.

Общие соглашение о коде C#

⬆ К началу статьи

Соблюдайте SRP (SOLID)

SRP – принцип единой ответственности. Этот принцип означает, что каждый скрипт в вашем коде должен выполнять одну операцию.

⬆ К началу статьи

Соблюдайте принцип DRY

DRY – Don’t repeat yourself (не повторяй себя). Всегда думайте о том, как можно переиспользовать тот или иной фрагмент скрипта. Что можно выделить в универсальный скрипт/функцию. Речь не идет о написании активностей - я имею в виду очень похожею логику, которая встречается в нескольких местах.

Есть еще принипы KISS, YAGNI:

KISS - Keep it simple, stupid («Сделай это проще, тупица») - "чем проще - тем лучше", но это не означает сделать быстро и кое как

YAGNI - "тебе это не нужно", не прописывай функции, которые могут и не понадобиться в будущем

⬆ К началу статьи

Используйте минимальное кол-во аргументов
  • Меньше - лучше
  • Если скрипт принимает слишком много аргументов, возможно он нарушает SRP
  • Большое кол-во аргументов - проблемы с тестированием
  • Большое кол-во аргументов возможно стоит завернуть в объект(например словарь)

⬆ К началу статьи

Используйте $,@,""" при работе со строками

⬆ К началу статьи

Используйте LINQ

Используйте LINQ вместо циклов и встроенных активностей при работе с коллекциями

Плюсы

  • Компактный, умещается в одну активность
  • Упрощает понимание запроса/алгоритма
  • Гибкий, расширяемость и деревья выражений позволяют выполнить любой запрос
  • Наличие методы для паралельной обработки

Минусы

  • Сложная отладка больших запросов
  • Производительность (for > foreach > LINQ)

Примеры:

UseLINQ UseLINQ2

Исключения:

  • При работе с внешними сервисами (файлы, почта, БД,UI)
  • Большая бизнес логика

⬆ К началу статьи

Используйте условные операторы

Использование условных операторов вместо встроенных if активностей, позволяют писать компактные и легко читаемый код

Операторы с условным ?. значением NULL и ?[]

operator

Тернарный условный оператор (?: оператор)

operator2

в PIX контекстные значения, это свойства в C#, поэтому нельзя использовать out и ref напрямую

operator2_2

Операторы объединения со значением NULL (?? И?? = операторы)

operator3

Исключения:

  • Большая бизнес-логика

operatornotuse

⬆ К началу статьи

Избегайте Boxing и Unboxing

По сравнению с простыми операциями присваивания операции упаковки и распаковки являются весьма затратными процессами с точки зрения вычислений. При выполнении упаковки типа значения необходимо создать и разместить новый объект. Объем вычислений при выполнении операции распаковки, хотя и в меньшей степени, но тоже весьма значителен.

Источник (Microsoft)

⬆ К началу статьи

Избегайте комментариев Комментарии не нужны, пишите самодокументируемый код. Если комментарии необходимы, стоит задуматься об чистоте кода

Исключения:

  • TODO
  • Поведения, противоречащее логике

⬆ К началу статьи

Избегайте флагов в аргументах Флаг указывает на то, что у метода есть несколько функций. Лучше всего, если у метода есть только одна функция (принцип SRP). Разделите метод на две части, если логический параметр добавляет к методу несколько функций.
  • упрощает поддержку
  • упрощает модульное тестирование

Например вместо CreateFile → CreateFile, CreateTempFile

⬆ К началу статьи

Избегайте глубоких вложенний Добавить

⬆ К началу статьи

Избегайте отрицательных условий Добавить

⬆ К началу статьи

Избегайте громоздких if-ов Добавить

⬆ К началу статьи

Временные решения
  • Если скрипт часто вызывается, замените его на контейнер (пока не решится вопрос логами)

⬆ К началу статьи

pix-conventions's People

Contributors

themrdjek avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.