hi,我是熵减,见字如面。
软件开发是一项复杂的系统工程,随着时间的演进,复杂度会自然的增长。
如果想要避免系统内熵的过快增长,就需要我们在研发过程中,刻意的做减法,来保持系统的简单性和可靠性。
KISS原则就是一条可让系统保持简单的行动指导原则。
那什么是KISS原则呢?下面我们具体看看吧。
KISS原则指的是“保持简单原则”(Keep It Simple, Stupid)。
“保持简单”是指在设计、开发、实现和管理过程中,应该采用简单的方法和策略来解决问题,以便更容易理解、实现、维护和使用。
KISS原则的基本思想是:在设计或解决问题时,应该尽可能地简化,不要过度复杂化。 这是因为简单的解决方案通常更可靠,更易于理解和维护,并且更具可扩展性。
这个原则最初用于设计和工程领域,但现在已经成为了一个广泛应用于各种领域的管理和生活原则。
以下是KISS原则的最佳实践:
总之,遵循KISS原则的这些最佳实践建议,是要保持代码尽可能的简单、易于理解和容易维护。
以下是KISS原则的常见几个反模式:
总之,KISS原则的常见反模式都是导致代码复杂性增加、难以理解和维护的原因,应该尽可能避免。
以下是一个过度工程化的代码案例,其违反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 原则。
以上,是关于KISS原则的意义,最佳实践经验和常见反模式的简单的总结,希望对你有所启发或帮助。
KISS原则不仅仅是一条软件设计的指导原则,其也同样使用于我们的生活和工作中。保持简单,不要有太多的技巧,可能是做事最高效和最有效的方法。
将事情做复杂是一个自然的过程,而将复杂的事情做简单,则是一项关键的能力。
保持简单,是一个熵减的过程。
—————— THE END ——————
行动进化自己,输出成就他人
与你一同终身成长