查看完整版本 : Type of variable 有什麼作用?

assembly.jc 2018-9-5 19:17

一般的 static typed language 如 C, Java 等, variable 都有 type,但限制並不嚴格,可自自由用 casting 轉換,例如 C, char 可以轉做 Int, Int 可以轉做 pointer...

Java 等 OOP language 好一點,不是繼承同一個 basic Class,不可做 casting,但何惜有 universal class; 指的是 Object,只要 cast to Object,就可任意 cast to 任何 Class (Type)。

Haskell 就比較嚴,沒有 casting,也沒有 universal type。

好了,問題是嚴格執行 type checking,有何作用呢? 一般來說,這可幫 compiler 找到錯誤,不至於 runtime 時出錯。
另一方面,type 也涉及一般化 (generic) 的問題。
但除此之久,有沒有更深的意義呢? 另,有沒有利用 variable type 去令自己的 program 更安全或更少錯誤呢? 

form5 2018-9-5 22:23

Type checking 睇情況啦, 
js 需要但是沒有,
C# 有dynamic object 有時好好用,
Python type hint 幚到IDE 手
F# algebra type 容易 去 做domain driven design

煙民母親生賤種

*** 作者被禁止或刪除 內容自動屏蔽 ***

assembly.jc 2018-9-6 16:03

[quote]原帖由 [i]form5[/i] 於 2018-9-5 10:23 PM 發表 [url=https://computer.discuss.com.hk/redirect.php?goto=findpost&pid=486839112&ptid=27694329][img]https://computer.discuss.com.hk/images/common/back.gif[/img][/url]
Type checking 睇情況啦,
js 需要但是沒有,
C# 有dynamic object 有時好好用,
Python type hint 幚到IDE 手
F# algebra type 容易 去 做domain driven design [/quote]

js 可以隨意加減 properties (methods),要 type safety,可能要限制這種能力。

看了 M$ 記的例子,C#的 dynamic object 做乜攪到咁複雜。是完全放棄了 type safety 嗎? 有時實務上的方便真係勝於一切。

經常見 5 兄提及 F#,可否介紹一下? 何以適合做 domain driven design 呢?

assembly.jc 2018-9-6 16:14

[quote]原帖由 [i]煙民母親生賤種[/i] 於 2018-9-6 02:55 AM 發表 [url=https://computer.discuss.com.hk/redirect.php?goto=findpost&pid=486848525&ptid=27694329][img]https://computer.discuss.com.hk/images/common/back.gif[/img][/url]
好似唔係喎。有做到 type casting operator 先可以做  casting conversion。無既,都唔係自由轉換。
[url=https://stackoverflow.com/questions/28307887/c-type-cast-operator-overloading-and-implicit-conversions]https://stackoverflow.com/questions/28307887/c-type-cast-operator-overloading-and-implicit-conversions[/url] ... [/quote]

呢方面 C++ 好過 Java

[[i] 本帖最後由 assembly.jc 於 2018-9-6 06:09 PM 編輯 [/i]]

assembly.jc 2018-9-6 18:29

[quote]原帖由 [i]煙民母親生賤種[/i] 於 2018-9-6 02:55 AM 發表 [url=https://computer.discuss.com.hk/redirect.php?goto=findpost&pid=486848525&ptid=27694329][img]https://computer.discuss.com.hk/images/common/back.gif[/img][/url]
好似唔係喎。有做到 type casting operator 先可以做  casting conversion。無既,都唔係自由轉換。
[url=https://stackoverflow.com/questions/28307887/c-type-cast-operator-overloading-and-implicit-conversions]https://stackoverflow.com/questions/28307887/c-type-cast-operator-overloading-and-implicit-conversions[/url] ... [/quote]

但 pointer check 唔到[code]class ClsA {};

class ClsB {};[/code][code]        ClsA a;
        ClsB *b = (ClsB*) &a; //Work[/code]

jasonchan35 2018-9-6 19:12

[quote]原帖由 [i]assembly.jc[/i] 於 2018-9-6 06:29 PM 發表 [url=https://computer.discuss.com.hk/redirect.php?goto=findpost&pid=486885496&ptid=27694329][img]https://computer.discuss.com.hk/images/common/back.gif[/img][/url]


但 pointer check 唔到class ClsA {};

class ClsB {};        ClsA a;
        ClsB *b = (ClsB*) &a; //Work [/quote]

係 C++ 應該避免用舊式既 implicit casting (ClsB*)
應該用 ClsB* b = static_cast<ClsB*>(&a)
咁就會 check
如果唔想 check 先用 reinterpret_cast

assembly.jc 2018-9-6 19:52

[quote]原帖由 [i]jasonchan35[/i] 於 2018-9-6 07:12 PM 發表 [url=https://computer.discuss.com.hk/redirect.php?goto=findpost&pid=486887471&ptid=27694329][img]https://computer.discuss.com.hk/images/common/back.gif[/img][/url]


係 C++ 應該避免用舊式既 implicit casting (ClsB*)
應該用 ClsB* b = static_cast(&a)
咁就會 check
如果唔想 check 先用 reinterpret_cast [/quote]

Thanks jason 兄。咁 void * 有冇方法 check 到?[code]        ClsA a;
        void *v = &a;
        ClsB *b = static_cast<ClsB*> (v); //Work[/code]

jasonchan35 2018-9-6 20:27

[quote]原帖由 [i]assembly.jc[/i] 於 2018-9-6 07:52 PM 發表 [url=https://computer.discuss.com.hk/redirect.php?goto=findpost&pid=486889428&ptid=27694329][img]https://computer.discuss.com.hk/images/common/back.gif[/img][/url]


Thanks jason 兄。咁 void * 有冇方法 check 到?        ClsA a;
        void *v = &a;
        ClsB *b = static_cast (v); //Work [/quote]

如果有 enable RTTI 可以用 dynamic_cast
如果你係想好似 Java 咁 Object cast 去其他 Class
建議整一個自己既 MyObject class 做 base class, 始終 void* 算係 low-level 既 type

assembly.jc 2018-9-6 22:40

[quote]原帖由 [i]jasonchan35[/i] 於 2018-9-6 08:27 PM 發表 [url=https://computer.discuss.com.hk/redirect.php?goto=findpost&pid=486891165&ptid=27694329][img]https://computer.discuss.com.hk/images/common/back.gif[/img][/url]


如果有 enable RTTI 可以用 dynamic_cast
[/quote]
dynamic_cast 可以防止 void * cast 去其他 Class 類型 的pointer? (compile time)

[quote]

如果你係想好似 Java 咁 Object cast 去其他 Class
建議整一個自己既 MyObject class 做 base class, 始終 void* 算係 low-level 既 type ... [/quote]
不是,如 #1 所說,想討論一下 type of variable 對程式的穩健和安全所起的作用。

jasonchan35 2018-9-6 23:04

[quote]原帖由 [i]assembly.jc[/i] 於 2018-9-6 10:40 PM 發表 [url=https://computer.discuss.com.hk/redirect.php?goto=findpost&pid=486897719&ptid=27694329][img]https://computer.discuss.com.hk/images/common/back.gif[/img][/url]

dynamic_cast 可以防止 void * cast 去其他 Class 類型 的pointer? (compile time)
不是,如 #1 所說,想討論一下 type of variable 對程式的穩健和安全所起的作用。 [/quote]

dynamic_cast 要 run-time check null

type of variable 對程式的穩健和安全, 當然有用, 用 Assembly 就真係咩 type 都唔理你
但係 C/C++ 可以容許做 Low Level 動作, 或多或少會比較危險
但完全唔容許 Low Level 又會有好多野做唔到, 所以 Java, C# 之類點都係慢過 C/C++ 3,4 倍

Rust 可能好 D, 但其實都好多要靠 Run-time check
講到尾都係要睇返 Programmer, 例如用好 D 既習慣 or Pattern,
有好多 C/C++ 舊既用法避免係新寫既 code 去用
而好似 Java Object 可以 run-time cast 係有實際用處, 當然真係要用既時候, 要諗清楚有無更好既方法,
可以 compile time check 晒, 唔駛靠 run-time 再 check

[[i] 本帖最後由 jasonchan35 於 2018-9-6 11:08 PM 編輯 [/i]]

Susan﹏汪汪 2018-9-6 23:15

Swift的pointer 格硬轉型係叫做rebounding

[code]// C
void* ptr = ...
char* bytes = (char*) ptr;

// Swift
let ptr: UnsafeRawPointer = ...
let bytes: UnsafePointer<UInt8> = ptr.assumingMemoryBound(to: UInt8.self)

let nullable_ptr: UnsafeRawPointer? = ...
let nullable_bytes: UnsafePointer<UInt8>? = nullable_ptr?.assumingMemoryBound(to: UInt8.self)[/code]

[[i] 本帖最後由 Susan﹏汪汪 於 2018-9-6 11:41 PM 編輯 [/i]]

Susan﹏汪汪 2018-9-6 23:20

[quote]原帖由 [i]assembly.jc[/i] 於 2018-9-5 07:17 PM 發表 [url=https://www.discuss.com.hk/redirect.php?goto=findpost&pid=486827920&ptid=27694329][img]https://www.discuss.com.hk/images/common/back.gif[/img][/url]
一般的 static typed language 如 C, Java 等, variable 都有 type,但限制並不嚴格,可自自由用 casting 轉換,例如 C, char 可以轉做 Int, Int 可以轉做 pointer...

Java 等 OOP language 好一點,不是繼承同一個 basic Class,不可做 casting,但何惜有 universal cla ... [/quote]
「有沒有利用 variable type 去令自己的 program 更安全或更少錯誤呢?」

基本上係日常

[code]

// Swift

func foo(_ image: UImage) { ... }

let myImage: UImage? = try? LoadingFromInternet()

foo(myImage)       // compile error!!!!!
[/code]

assembly.jc 2018-9-7 13:38

[quote]dynamic_cast 要 run-time check null [/quote]
什麼意思?

[quote]
Java Object 可以 run-time cast...[/quote]
Java run-time cast 是指什麼?

[quote]可以 compile time check 晒, 唔駛靠 run-time 再 check[/quote]
就 casting 呢項已經減低了 compiler 檢查錯誤的能力了,如果 C++ 唔比用 casting 會有什麼後果? 如果是 Java,C#,可能問題不大。

assembly.jc 2018-9-7 13:52

[quote]原帖由 [i]Susan﹏汪汪[/i] 於 2018-9-6 11:20 PM 發表 [url=https://computer.discuss.com.hk/redirect.php?goto=findpost&pid=486899844&ptid=27694329][img]https://computer.discuss.com.hk/images/common/back.gif[/img][/url]

「有沒有利用 variable type 去令自己的 program 更安全或更少錯誤呢?」

基本上係日常



// Swift

func foo(_ image: UImage) { ... }

let myImage: UImage? = try? LoadingFromInternet()

foo(myImage)       // compile error!!!!!
... [/quote]
是指 non-null parameter 唔接受 nullable argument 吧? 是個 variable type 發揮作用的好例子,減少好多 null checking 的 coding。
還有沒有其他例子?

Susan﹏汪汪 2018-9-7 13:59

[quote]原帖由 [i]assembly.jc[/i] 於 2018-9-7 01:38 PM 發表 [url=https://www.discuss.com.hk/redirect.php?goto=findpost&pid=486924676&ptid=27694329][img]https://www.discuss.com.hk/images/common/back.gif[/img][/url]

什麼意思?


Java run-time cast 是指什麼?


就 casting 呢項已經減低了 compiler 檢查錯誤的能力了,如果 C++ 唔比用 casting 會有什麼後果? 如果是 Java,C#,可能問題不大。 ... [/quote]
其實應該要分清楚upcasting同downcasting

OOP的upcasting係不會出錯
也是可以static cast、compile time完成

downcasting係不一定成功
C++的dynamic cast就是用係呢個情況
需要runtime check casting是不是成功

Susan﹏汪汪 2018-9-7 14:04

[quote]原帖由 [i]Susan﹏汪汪[/i] 於 2018-9-7 01:59 PM 發表 [url=https://computer.discuss.com.hk/redirect.php?goto=findpost&pid=486925789&ptid=27694329][img]https://computer.discuss.com.hk/images/common/back.gif[/img][/url]

其實應該要分清楚upcasting同downcasting

OOP的upcasting係不會出錯
也是可以static cast、compile time完成

downcasting係不一定成功
C++的dynamic cast就是用係呢個情況
需要runtime check casting是不是成功 ... [/quote]
用Swift做例子[code]class Parent { }

class Child: Parent {}

let a: Parent = Child()  // upcasting, always success.
let b: Parent = Parent()

let c: Child? = a as? Child  // down casting, success because type of a is Child
let d: Child? = b as? Child  // down casting, not success because type of b is not Child[/code]

Susan﹏汪汪 2018-9-7 14:49

[quote]原帖由 [i]assembly.jc[/i] 於 2018-9-7 01:52 PM 發表 [url=https://www.discuss.com.hk/redirect.php?goto=findpost&pid=486925432&ptid=27694329][img]https://www.discuss.com.hk/images/common/back.gif[/img][/url]

是指 non-null parameter 唔接受 nullable argument 吧? 是個 variable type 發揮作用的好例子,減少好多 null checking 的 coding。
還有沒有其他例子? [/quote]
汪汪諗起之前同你講過Sequence 和Collection
也是一個例子

例如如果寫左個lazy scan function
[url=https://developer.apple.com/documentation/swift/lazysequenceprotocol]https://developer.apple.com/documentation/swift/lazysequenceprotocol[/url]

先講講Collection 係有個count property
[code]

let myCollection: AnyCollection = ...

print(myCollection.count)

[/code]

但如果汪汪寫呢個
[code]

let something_1 = (0..<10).lazy.map { $0 + 1 }

something_1.count       // correct

let something_2 = (0..<10).lazy.scan(0) { $0 + $1 }

something_2.count      // compile error

[/code]

基本上static type可以幫你發現好多不可以做的操作

assembly.jc 2018-9-7 18:55

[quote]原帖由 [i]Susan﹏汪汪[/i] 於 2018-9-7 01:59 PM 發表 [url=https://computer.discuss.com.hk/redirect.php?goto=findpost&pid=486925789&ptid=27694329][img]https://computer.discuss.com.hk/images/common/back.gif[/img][/url]

其實應該要分清楚upcasting同downcasting

OOP的upcasting係不會出錯
也是可以static cast、compile time完成

downcasting係不一定成功
C++的dynamic cast就是用係呢個情況
需要runtime check casting是不是成功 ... [/quote]
指 downcasting,或者 downcasting 再 upcasting,compiler check 唔到,runtime 才 error。

assembly.jc 2018-9-7 19:00

[quote]let something_2 = (0..<10).lazy.scan(0) { $0 + $1 }
[/quote]

這句是什麼意思? 找 0 嗎? 找不到所以 error? compile time 都 check 到?

Susan﹏汪汪 2018-9-7 19:14

[quote]原帖由 [i]assembly.jc[/i] 於 2018-9-7 07:00 PM 發表 [url=https://www.discuss.com.hk/redirect.php?goto=findpost&pid=486940333&ptid=27694329][img]https://www.discuss.com.hk/images/common/back.gif[/img][/url]


這句是什麼意思? 找 0 嗎? 找不到所以 error? compile time 都 check 到? [/quote]
Haskell 的scanl

唔係搵數字
而係講緊LazyScanSequence係Sequence
沒有count呢個property

[[i] 本帖最後由 Susan﹏汪汪 於 2018-9-7 07:15 PM 編輯 [/i]]

Susan﹏汪汪 2018-9-7 19:39

拆成幾個step會容易D睇

[code]

let a : Range<Int> = 0..<10     // 呢個係RandomAccessCollection

let b: LazyCollection<Range<Int>> = a.lazy      // 一樣係RandomAccessCollection

let c: LazyScanSequence<Range<Int>, Int> = b.scan(0) { $0 + $1 }     // 呢到會降級變成Sequence

[/code]

所以就係static type的語言
就算好似汪汪前面咁一行過隱藏晒所有type 唔寫出來
都可以靠compile error提醒你有冇寫錯野

jasonchan35 2018-9-7 21:21

[quote]原帖由 [i]assembly.jc[/i] 於 2018-9-7 01:38 PM 發表 [url=https://computer.discuss.com.hk/redirect.php?goto=findpost&pid=486924676&ptid=27694329][img]https://computer.discuss.com.hk/images/common/back.gif[/img][/url]

什麼意思?


Java run-time cast 是指什麼?


就 casting 呢項已經減低了 compiler 檢查錯誤的能力了,如果 C++ 唔比用 casting 會有什麼後果? 如果是 Java,C#,可能問題不大。 ... [/quote]

同係 C++ 定 Java, C# 無咩關係, 依幾隻 language 都係一樣
upcasting 會視為安全, downcasting 就要到 run-time 先知係唔係真係o個個 type,
所以如果 c++ dynamic_cast<> (即 downcast) failure 會出 null
C# 就要睇你用咩
var a = (SomeType)obj; <-- will throw exception if downcast failure
var a = obj as SomeType; <--- will return null if downcast failure

至於唔用 casting 可能問題不大, 要睇你寫咩, 的確唔係個個 program 都要用到
但都好常用到, 只要你想用同一個 base class type 去處理個 object

如果你咁怕 casting 會錯, 你可以唔用, 如果都可以完成到你想做既野
但其實 program 會錯既野有千千萬萬種, run-time 要 check 晒所有可能既 error 係基本,
例如 write file 都有可能中途 disk error

FYI
[url=https://www.tutorialcup.com/cplusplus/upcasting-downcasting.htm]https://www.tutorialcup.com/cplusplus/upcasting-downcasting.htm[/url]

form5 2018-9-7 21:51

[quote]原帖由 [i]assembly.jc[/i] 於 2018-9-6 04:03 PM 發表 [url=https://computer.discuss.com.hk/redirect.php?goto=findpost&pid=486877976&ptid=27694329][img]https://computer.discuss.com.hk/images/common/back.gif[/img][/url]
js 可以隨意加減 properties (methods),要 type safety,可能要限制這種能力。

看了 M$ 記的例子,C#的 dynamic object 做乜攪到咁複雜。是完全放棄了 type safety 嗎? 有時實務上的方便真係勝於一切。

經常見 5 兄提及 F#,可否介紹一下? 何以適合做 domain driven design 呢? ... [/quote]
here is a introduction on "domain driven design with the F# type system".
[url]https://www.slideshare.net/ScottWlaschin/domain-driven-design-with-the-f-type-system-functional-londoners-2014[/url]
ScottWlaschin has a nice F# web site
[url]https://fsharpforfunandprofit.com/why-use-fsharp/[/url]

form5 2018-9-7 22:59

not only downcasting give exception


    class Employee { }
    class Manager : Employee { }
    class Clerk : Employee { }


     Clerk c = (Clerk) obj_instance_of_Manager; // fail and throw InvalidCastException


but I guess no one write such code, 

in a better way, to create a factory method for clerk


Clerk c = obj_instance_of_Manager.ToClerk();


in the real world, something like

   obj.ToJson()

Susan﹏汪汪 2018-9-7 23:05

[quote]原帖由 [i]form5[/i] 於 2018-9-7 10:59 PM 發表 [url=https://www.discuss.com.hk/redirect.php?goto=findpost&pid=486952329&ptid=27694329][img]https://www.discuss.com.hk/images/common/back.gif[/img][/url]
not only downcasting give exception


    class Employee { }
    class Manager : Employee { }
    class Clerk : Employee { }


     Clerk c = (Clerk) obj_instance_of_Manager; // fail and throw ... [/quote]
汪汪會叫呢種做法做「黑魔法」

有時候如果ClassA係其他人提供
冇辦法攞到裡面private資料或methods
就casting 做自己寫的ClassB然後再偷資料

assembly.jc 2018-9-8 13:45

[quote]原帖由 [i]Susan﹏汪汪[/i] 於 2018-9-7 07:39 PM 發表 [url=https://computer.discuss.com.hk/redirect.php?goto=findpost&pid=486942284&ptid=27694329][img]https://computer.discuss.com.hk/images/common/back.gif[/img][/url]
拆成幾個step會容易D睇



let a : Range = 0.. [/quote]
理解。Type inference 嘅例子,static typed language 另一個好處,dynamic language 要 runtime 才 check。雖然目前好流行 dynamic language,但一旦要 debug 其他人嘅 code,先會發現 static typed language 嘅好處。

assembly.jc 2018-9-8 13:58

[quote]原帖由 [i]jasonchan35[/i] 於 2018-9-7 09:21 PM 發表 [url=https://computer.discuss.com.hk/redirect.php?goto=findpost&pid=486947139&ptid=27694329][img]https://computer.discuss.com.hk/images/common/back.gif[/img][/url]


同係 C++ 定 Java, C# 無咩關係, 依幾隻 language 都係一樣
upcasting 會視為安全, downcasting 就要到 run-time 先知係唔係真係o個個 type,
所以如果 c++ dynamic_cast (即 downcast) failure 會出 null
C# 就要睇你用咩
var a = (SomeType)obj;  ... [/quote]

Thanks,咁睇來,雖然麻煩 d,dynamic_cast 都係一個解決之法。

Low level programming,casting 可能難避免 d,好似之前有位 ching 嘅例子,uint_t16 *p pointer 轉做 uint_t8* pointer,如果唔比 casting,就要 copy 整個 buffer data,或者 C/C++ 需要些明確型態轉換規則 (除了 casting 之外)。

assembly.jc 2018-9-8 16:12

[quote]原帖由 [i]form5[/i] 於 2018-9-7 09:51 PM 發表 [url=https://computer.discuss.com.hk/redirect.php?goto=findpost&pid=486948741&ptid=27694329][img]https://computer.discuss.com.hk/images/common/back.gif[/img][/url]

here is a introduction on "domain driven design with the F# type system".
[url=https://www.slideshare.net/ScottWlaschin/domain-driven-design-with-the-f-type-system-functional-londoners-2014]https://www.slideshare.net/ScottWlaschin/domain-driven-design-with-the-f-type-system-functional-londoners-2014[/url]
ScottWlasch ... [/quote]
Thanks, 初步了解了。集合 OO 和 Functional 好處嘅 language。可能 link 中例子比較簡單,只看到 Functional programming 表面的特性,如: immutable, no null, conciseness。


再來是 applicative, monad,甚至是 monad state transform,F# 原來有自己嘅一套再麻煩 d 嘅 monad state transform,小弟找不到相應的特性性,可能 F# 無嚴格隔離 pure and inpure code,無太大需要用它來處理 IO 和 mutable code。

但文中 F# 的確簡化了 OO 的操作,如 getter, setter 等等。

[[i] 本帖最後由 assembly.jc 於 2023-10-22 03:53 編輯 [/i]]

assembly.jc 2018-9-8 16:16

[quote]原帖由 [i]form5[/i] 於 2018-9-7 10:59 PM 發表 [url=https://computer.discuss.com.hk/redirect.php?goto=findpost&pid=486952329&ptid=27694329][img]https://computer.discuss.com.hk/images/common/back.gif[/img][/url]
not only downcasting give exception


    class Employee { }
    class Manager : Employee { }
    class Clerk : Employee { }


     Clerk c = (Clerk) obj_instance_of_Manager; // fail and throw ... [/quote]
obj_instance_of_Manager 是什麼 type? Employee, Manager ?
如果是 Manager, compile time 會 check 到。

[[i] 本帖最後由 assembly.jc 於 2018-9-10 01:14 AM 編輯 [/i]]
頁: [1] 2
查看完整版本: Type of variable 有什麼作用?