我目前正在製作一個項目。在這個項目中,許多對象都有一個ID,用於從代碼不同部分的配置文件中獲取實體的屬性和行爲。使用枚舉作爲對象ID
我使用String作爲ID,那對我很不錯,但也存在一些問題:
的錯別字不容易被發現;
有沒有代碼完成,所以我需要記住所有的ID
我想用枚舉結構作爲對象ID。這應該解決所有這些問題。我想知道,是否有使用枚舉作爲實體標識符的缺陷?
我目前正在製作一個項目。在這個項目中,許多對象都有一個ID,用於從代碼不同部分的配置文件中獲取實體的屬性和行爲。使用枚舉作爲對象ID
我使用String作爲ID,那對我很不錯,但也存在一些問題:
的錯別字不容易被發現;
有沒有代碼完成,所以我需要記住所有的ID
我想用枚舉結構作爲對象ID。這應該解決所有這些問題。我想知道,是否有使用枚舉作爲實體標識符的缺陷?
有使用枚舉作爲ID的不少缺陷:
==
比較兩個枚舉情況下,你需要要麼使用switch
或a.equals(b)
或Type.enumEq(a,b)
恕我直言,除了這些,主要的錯誤是,如果您添加枚舉項,枚舉表示可能會改變,因爲它們的表示包含它們在枚舉中的索引。
因此,如果將代碼從enum ID { Foo; Bar }
更新爲enum ID { Zero; Foo; Bar; }
,Foo和Bar值將更改其索引,這可能會導致意外的行爲。
如果您計劃序列化並存儲這些值,這是一個主要問題。
我覺得你最好的選擇是使用@:enum abstract
按照https://haxe.org/manual/types-abstract-enum.html
這樣,你得到兩全其美:你的ID是實際運行時的字符串,但是編譯器知道這是預期值,你會得到嚴格打字。
我也推薦'@:enum abstract' – KevinResoL
你總是可以聲明字符串常量,不是嗎?它解決了你的兩個問題。 – Sweeper
我認爲這有些相當於枚舉,不是嗎? – Gulvan
我對haxe瞭解不多。如果它們在haxe中是同一個事物,那就使用它。一些編程語言不允許字符串成爲枚舉的基礎值。 – Sweeper