狠狠色丁香婷婷综合尤物/久久精品综合一区二区三区/中国有色金属学报/国产日韩欧美在线观看 - 国产一区二区三区四区五区tv

LOGO OA教程 ERP教程 模切知識交流 PMS教程 CRM教程 開發文檔 其他文檔  
 
網站管理員

軟件工程:Kiss原則,復雜事情簡單做,是重要的能力

admin
2023年7月12日 8:56 本文熱度 622

軟件開發是一項復雜的系統工程,隨著時間的演進,復雜度會自然的增長。

如果想要避免系統內熵的過快增長,就需要我們在研發過程中,刻意的做減法,來保持系統的簡單性和可靠性。

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-2025 ClickSun All Rights Reserved