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.
Требования

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. в свойствах не должно быть получение других классов, а получать через методы
пример
// хорошо
public bool IsDelete => DeleteUserID != null;

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

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

Общее

  • Использовать Dapper для работы с БД.
  • Для справочника должны быть поля статус, дата создания, кто создал, дата удаления, кто удалил. Данные из БД не удалять.
  • В модели не должно быть методов с формированием разметки HTML
  • Должна быть обрабатыка ошибок(try|catch) и логирование
  • Интерполяция строк, использовать $@"".
пример
// хорошо
$"добавлен 1C-пользователь {user.surname} {user.name} id:{user.id}"

// плохо
str.AppendFormat("<div class='col-lg-9 divTextBid'>{0}</div>",
                        myReader["countAdult"].ToString());
Пример
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. тип поля должен соответствовать полю класса
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment