Skip to content

Instantly share code, notes, and snippets.

@arxipovdev
Last active August 16, 2018 13:41
Show Gist options
  • Select an option

  • Save arxipovdev/2ccd87878418f063579d9c965e14ead3 to your computer and use it in GitHub Desktop.

Select an option

Save arxipovdev/2ccd87878418f063579d9c965e14ead3 to your computer and use it in GitHub Desktop.

Revisions

  1. arxipovdev revised this gist Aug 16, 2018. 1 changed file with 2 additions and 4 deletions.
    6 changes: 2 additions & 4 deletions requirements.md
    Original file line number Diff line number Diff line change
    @@ -37,10 +37,8 @@ public Bid GetBid(){...}
    ###### пример
    ``` C#
    // хорошо
    var text = $@"<p>Здравствуйте, {user.userName}</p>
    <p>Ваши данные для авторизации:</p>
    <p>Логин: {user.email}</p>
    <p>Пароль: {user.password}</p>"
    $"добавлен 1C-пользователь {user.surname} {user.name} id:{user.id}"

    // плохо
    str.AppendFormat("<div class='col-lg-9 divTextBid'>{0}</div>",
    myReader["countAdult"].ToString());
  2. arxipovdev renamed this gist Aug 16, 2018. 1 changed file with 0 additions and 0 deletions.
    File renamed without changes.
  3. arxipovdev created this gist Aug 16, 2018.
    170 changes: 170 additions & 0 deletions requirements
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,170 @@
    ## C#
    ### Класс
    1. все классы, члены класса именуются PascalCasing;
    2. у класса должен быть комментарий и все его члены должны быть прокомментированны;
    3. должен быть namespace;
    4. имя класса в единственном числе;
    5. класс должен быть описан в отдельном файле;
    6. если конструктор используется по умолчанию, то дефолтный который создает IDE удалять;
    7. не выдумывать имя свойства для Cправочника, например назвать поле Name, а не CountryName или type_name
    8. не выдумывать имена основных методов(CRUD) см.пример, использовать:
    - Get()
    - GetById(id)
    - Update()
    - Create()
    - Delete()
    9. в свойствах не должно быть получение других классов, а получать через методы
    ###### пример
    ``` C#
    // хорошо
    public bool IsDelete => DeleteUserID != null;

    // плохо
    public string office { get => dic_company_users_office.GetDefaultOfficeUser(id)._officeName; }

    // хорошо
    public Bid GetBid(){...}
    ```
    10. не создовать в модели лишние методы которые получают определенные поля или обновляют какое то определенное поле, например не писать так GetUserName(), UpdateFio()
    11. поля(внешние ключи) писать например CountryID, UserID, ClientID, а не country_id, IdUser._

    ### Общее
    - Использовать Dapper для работы с БД.
    - Для справочника должны быть поля статус, дата создания, кто создал, дата удаления, кто удалил. Данные из БД не удалять.
    - В модели не должно быть методов с формированием разметки HTML
    - Должна быть обрабатыка ошибок(try|catch) и логирование
    - Интерполяция строк, использовать $@"".
    ###### пример
    ``` C#
    // хорошо
    var text = $@"<p>Здравствуйте, {user.userName}</p>
    <p>Ваши данные для авторизации:</p>
    <p>Логин: {user.email}</p>
    <p>Пароль: {user.password}</p>"
    // плохо
    str.AppendFormat("<div class='col-lg-9 divTextBid'>{0}</div>",
    myReader["countAdult"].ToString());
    ```

    ###### Пример
    ``` C#
    namespace Itrips.Models {
    /// <summary>
    /// Вид тура
    /// </summary>
    [Table("TypeTours")]
    public class TypeTour {
    /// <summary>
    /// ID
    /// </summary>
    [Key]
    public int ID { get; set; }

    /// <summary>
    /// Название
    /// </summary>
    public string Name { get; set; }

    /// <summary>
    /// Статус
    /// </summary>
    public bool IsActivity { get; set; } = true;

    /// <summary>
    /// Кто создал
    /// </summary>
    public Guid CreateUserID { get; set; }

    /// <summary>
    /// Дата создания
    /// </summary>
    public DateTime DateAdd { get; set; }

    /// <summary>
    /// Кто удалил
    /// </summary>
    public Guid? DeleteUserID { get; set; }

    /// <summary>
    /// Дата удаления
    /// </summary>
    public DateTime? DateDelete { get; set; }

    /// <summary>
    /// Удалено?
    /// </summary>
    [Write(false)]
    public bool IsDelete => DeleteUserID != null;


    /// <summary>
    /// Получить Все(если передать true то только активные)
    /// </summary>
    /// <param name="isActivity"></param>
    /// <returns></returns>
    public static List<TypeTour> Get(bool isActivity = false) {
    using (var connection = DBModule.NewSqlConnection())
    {
    return isActivity ?
    connection.Query<TypeTour>("SELECT * FROM TypeTours WHERE DeleteUserID IS NULL AND IsActivity = @isActivity ORDER BY Name", new { isActivity }).ToList() :
    connection.Query<TypeTour>("SELECT * FROM TypeTours WHERE DeleteUserID IS NULL ORDER BY Name").ToList();
    }
    }

    /// <summary>
    /// Получить по ID
    /// </summary>
    /// <param name="id"></param>
    /// <returns></returns>
    public static TypeTour GetById(int id) {
    using (var connection = DBModule.NewSqlConnection())
    {
    return connection.QueryFirstOrDefault<TypeTour>("SELECT * FROM TypeTours WHERE ID = @id", new { id });
    }
    }

    /// <summary>
    /// Создать
    /// </summary>
    /// <returns></returns>
    public TypeTour Create() {
    using (var connection = DBModule.NewSqlConnection())
    {
    DateAdd = DateTime.Now;
    CreateUserID = Guid.Parse(new AuthorizationModule().getUserKod());
    ID = (int)connection.Insert(this);
    return this;
    }
    }

    /// <summary>
    /// Обновить
    /// </summary>
    /// <returns></returns>
    public TypeTour Update() {
    using (var connection = DBModule.NewSqlConnection())
    {
    connection.Update(this);
    return this;
    }
    }

    /// <summary>
    /// Удалить
    /// </summary>
    /// <param name="id"></param>
    /// <returns></returns>
    public static bool Delete(int id) {
    var typeTour = GetById(id);
    typeTour.DateDelete = DateTime.Now;
    typeTour.DeleteUserID = Guid.Parse(new AuthorizationModule().getUserKod());
    typeTour = typeTour.Update();
    return typeTour.DateDelete != null;
    }
    }
    }
    ```
    ### База данных
    1. имя таблицы как имя класса только во множественном числе
    2. имена у всех полей(Pascal casing) как у класса
    3. тип поля должен соответствовать полю класса