LOGO OA教程 ERP教程 模切知识交流 PMS教程 CRM教程 开发文档 其他文档  
 
网站管理员

软件工程:Kiss原则,复杂事情简单做,是重要的能力

admin
2023年7月12日 8:56 本文热度 580

软件开发是一项复杂的系统工程,随着时间的演进,复杂度会自然的增长。

如果想要避免系统内熵的过快增长,就需要我们在研发过程中,刻意的做减法,来保持系统的简单性和可靠性。

KISS原则就是一条可让系统保持简单的行动指导原则。

那什么是KISS原则呢?下面我们具体看看吧。

Part1什么是KISS原则

KISS原则指的是“保持简单原则”(Keep It Simple, Stupid)。

“保持简单”是指在设计、开发、实现和管理过程中,应该采用简单的方法和策略来解决问题,以便更容易理解、实现、维护和使用。

KISS原则的基本思想是:在设计或解决问题时,应该尽可能地简化,不要过度复杂化。 这是因为简单的解决方案通常更可靠,更易于理解和维护,并且更具可扩展性。

这个原则最初用于设计和工程领域,但现在已经成为了一个广泛应用于各种领域的管理和生活原则。

Part2KISS原则的最佳实践

以下是KISS原则的最佳实践:

  • 避免过度设计:不要试图预测未来可能发生的情况,只关注当前需求,尽量避免过度设计。

  • 尽量简化代码:使用简单的代码结构和算法,尽可能避免复杂的嵌套和逻辑。

  • 保持一致性:在代码中使用统一的命名规则、代码格式和注释,保持代码风格的一致性。

  • 避免重复代码:避免在代码中重复相同的逻辑,尽量将相同的代码封装成方法或类。

  • 提高代码可读性:使用有意义的变量名、方法名和注释,使代码更容易理解和阅读。

  • 不要过早地进行优化:在代码编写的早期,不要过早地考虑性能优化,尽可能使代码易于理解和维护。

  • 保持代码精简:避免使用过多的库和框架,只使用必要的工具和库,减少代码的复杂性和依赖关系。

总之,遵循KISS原则的这些最佳实践建议,是要保持代码尽可能的简单、易于理解和容易维护。

Part3KISS原则的反模式

以下是KISS原则的常见几个反模式:

  • 过度工程化:过度设计和过度开发会导致代码复杂性增加,影响代码的可读性和可维护性。

  • 滥用设计模式:使用过多的设计模式会导致代码复杂性增加,难以理解和维护。

  • 复制黏贴代码:复制黏贴代码可能导致代码重复和冗余,增加代码复杂性,难以维护。

  • 过早优化:在代码编写早期过度关注性能优化,可能会影响代码的可读性和可维护性,同时可能导致不必要的代码复杂性。

  • 不遵循命名规范:命名不规范、不统一的变量和方法名可能会导致代码难以理解和维护。

  • 不遵循单一职责原则:一个类或方法负责过多的功能,会导致代码复杂性增加,难以理解和维护。

  • 滥用注释:过多的注释可能会导致代码复杂性增加,同时也可能难以维护。

总之,KISS原则的常见反模式都是导致代码复杂性增加、难以理解和维护的原因,应该尽可能避免。

Part4一个经典反例

以下是一个过度工程化的代码案例,其违反KISS原则,具体Java代码如下:

public abstract class AbstractBaseDao<T> implements BaseDao<T> {

    private EntityManager entityManager;
    private Class<T> entityClass;

    public AbstractBaseDao(Class<T> entityClass) {
        this.entityClass = entityClass;
    }

    protected EntityManager getEntityManager() {
        if (entityManager == null) {
            entityManager = Persistence.createEntityManagerFactory("persistence-unit").createEntityManager();
        }
        return entityManager;
    }

    @Override
    public T findById(Long id) {
        return getEntityManager().find(entityClass, id);
    }

    @Override
    public List<T> findAll() {
        CriteriaBuilder criteriaBuilder = getEntityManager().getCriteriaBuilder();
        CriteriaQuery<T> criteriaQuery = criteriaBuilder.createQuery(entityClass);
        Root<T> root = criteriaQuery.from(entityClass);
        criteriaQuery.select(root);
        return getEntityManager().createQuery(criteriaQuery).getResultList();
    }

    @Override
    public void save(T entity) {
        getEntityManager().getTransaction().begin();
        getEntityManager().persist(entity);
        getEntityManager().getTransaction().commit();
    }

    @Override
    public void update(T entity) {
        getEntityManager().getTransaction().begin();
        getEntityManager().merge(entity);
        getEntityManager().getTransaction().commit();
    }

    @Override
    public void delete(T entity) {
        getEntityManager().getTransaction().begin();
        getEntityManager().remove(entity);
        getEntityManager().getTransaction().commit();
    }

    @Override
    public void deleteById(Long id) {
        T entity = findById(id);
        if (entity != null) {
            delete(entity);
        }
    }
}

public interface BaseDao<T> {

    T findById(Long id);

    List<T> findAll();

    void save(T entity);

    void update(T entity);

    void delete(T entity);

    void deleteById(Long id);
}

public class UserDaoImpl extends AbstractBaseDao<User> implements UserDao {

    public UserDaoImpl() {
        super(User.class);
    }

    @Override
    public List<User> findByName(String name) {
        CriteriaBuilder criteriaBuilder = getEntityManager().getCriteriaBuilder();
        CriteriaQuery<User> criteriaQuery = criteriaBuilder.createQuery(User.class);
        Root<User> root = criteriaQuery.from(User.class);
        criteriaQuery.select(root);
        criteriaQuery.where(criteriaBuilder.equal(root.get("name"), name));
        return getEntityManager().createQuery(criteriaQuery).getResultList();
    }
}

public interface UserDao extends BaseDao<User> {

    List<User> findByName(String name);
}

在这个例子中,实现了一个通用的 BaseDao 接口和抽象类 AbstractBaseDao,其中 AbstractBaseDao 是一个抽象类,包含了基本的 CRUD 操作,而 UserDaoImpl 是一个具体实现类,实现了 UserDao 接口,通过继承 AbstractBaseDao 来实现对 User 对象的数据操作。

虽然这种方式可以实现基本的数据操作,但是通过抽象类和接口的方式,增加了代码的复杂性和抽象程度,代码中的 EntityManager、CriteriaBuilder 等 API 的使用也增加了代码的复杂性。这种过度工程化的代码实现方式会导致代码不易于理解和维护,同时增加了开发时间和成本。

如何改进以上代码呢?

为了符合 KISS 原则,可以对以上代码进行简化和改进,以下是改进后的 Java 代码:

public class UserDao {

    private EntityManager entityManager;

    public UserDao(EntityManager entityManager) {
        this.entityManager = entityManager;
    }

    public User findById(Long id) {
        return entityManager.find(User.class, id);
    }

    public List<User> findAll() {
        String jpql = "select u from User u";
        TypedQuery<User> query = entityManager.createQuery(jpql, User.class);
        return query.getResultList();
    }

    public void save(User user) {
        entityManager.getTransaction().begin();
        entityManager.persist(user);
        entityManager.getTransaction().commit();
    }

    public void update(User user) {
        entityManager.getTransaction().begin();
        entityManager.merge(user);
        entityManager.getTransaction().commit();
    }

    public void delete(User user) {
        entityManager.getTransaction().begin();
        entityManager.remove(user);
        entityManager.getTransaction().commit();
    }

    public void deleteById(Long id) {
        User user = findById(id);
        if (user != null) {
            delete(user);
        }
    }

    public List<User> findByName(String name) {
        String jpql = "select u from User u where u.name = :name";
        TypedQuery<User> query = entityManager.createQuery(jpql, User.class);
        query.setParameter("name", name);
        return query.getResultList();
    }
}

在这个例子中,我们去掉了抽象类和接口的层次,将 UserDao 定义为一个具体的类,其中包含了所有 User 对象的数据操作,同时去掉了 CriteriaBuilder 等 API 的使用,简化了代码的复杂性。

同时,我们将 EntityManager 对象通过构造函数传入 UserDao 中,这样可以更灵活地管理 EntityManager 对象的生命周期,避免在每个方法中都创建 EntityManager 对象。在每个数据操作方法中,我们也尽量避免了使用过多的 JPA API,采用了更简洁的 JPQL 语句来完成数据操作。

这样的代码更易于理解和维护,同时也减少了代码的复杂性,更符合 KISS 原则。

Part5最后

以上,是关于KISS原则的意义,最佳实践经验和常见反模式的简单的总结,希望对你有所启发或帮助。

KISS原则不仅仅是一条软件设计的指导原则,其也同样使用于我们的生活和工作中。保持简单,不要有太多的技巧,可能是做事最高效和最有效的方法。

将事情做复杂是一个自然的过程,而将复杂的事情做简单,则是一项关键的能力。

保持简单,是一个熵减的过程。


该文章在 2023/7/12 8:56:09 编辑过
关键字查询
相关文章
正在查询...
点晴ERP是一款针对中小制造业的专业生产管理软件系统,系统成熟度和易用性得到了国内大量中小企业的青睐。
点晴PMS码头管理系统主要针对港口码头集装箱与散货日常运作、调度、堆场、车队、财务费用、相关报表等业务管理,结合码头的业务特点,围绕调度、堆场作业而开发的。集技术的先进性、管理的有效性于一体,是物流码头及其他港口类企业的高效ERP管理信息系统。
点晴WMS仓储管理系统提供了货物产品管理,销售管理,采购管理,仓储管理,仓库管理,保质期管理,货位管理,库位管理,生产管理,WMS管理系统,标签打印,条形码,二维码管理,批号管理软件。
点晴免费OA是一款软件和通用服务都免费,不限功能、不限时间、不限用户的免费OA协同办公管理系统。
Copyright 2010-2024 ClickSun All Rights Reserved