From dbdd3d8d076d60e2a3795df76cc998e539574c7c Mon Sep 17 00:00:00 2001 From: darkicewolf50 Date: Tue, 1 Apr 2025 16:47:10 -0600 Subject: [PATCH] started ch18.1 --- Characteristics of OO Languages.md | 59 +++++++++++++++++++++++++++++ hello_cargo/target/.rustc_info.json | 2 +- 2 files changed, 60 insertions(+), 1 deletion(-) diff --git a/Characteristics of OO Languages.md b/Characteristics of OO Languages.md index 8cd095c..ac66e98 100644 --- a/Characteristics of OO Languages.md +++ b/Characteristics of OO Languages.md @@ -1 +1,60 @@ # Characteristics of Object-Oriented Languages + +There is no consensus about what features a language must have to be considered object-oriented. + +Rust is influenced by many programming paradigms, including OOP. + +Arguably, OOP languages share certain common characteristics, namely objects, encapsulations and ingeritance. + +Lets see what each of those means and whether Rust supports it. + +## Object Contain Data and Behavior + +The book _Design Patterns: Elements of Reusable Object-Oriented Software_ by Erich Gamma, Richard Helm, Ralph Johnson, and John Vlissides (Addison-Wesley Professional, 1994). + +This is colloquially referred to as _The Gang of Four_ book, is a catalog of object-oriented design patters. + +It defines OOP as this: +Object-oriented programs are made up of objects. +An _object_ packages both data and the procedures that operate on that data. +The procedures are typically called _methods_ or _operations_. +Using this definition, Rust is object-oriented: structs and enumbs have data, and `impl` blocks provide methods on structs and enums. + +Even though structs and enums with methods aren't _called_ obejcts, they provide the same functionaliy accound to the Gang of Four's definition of objects. + +## Encapsulation that Hides Implementation Details + +An aspect commonly associated with OOP is the idea of _encapsulation_. + +This means that the implementation details of an object aren't accessible to code using that object. + +Therefore, the only way to interact with an object is through its public API. + +Code using the object shouldn't be able to reach into the object's internals and change data or behaviro directly. + +This enables the programmer to change and refactor an object's internals without needing to change the code that uses the object. + +We discussed previously how to control encapsulation in Ch7. + +We can use the `pub` keyword to decide which modules, types, function and methods in our code should be public . + +By default everything else is private. + +For example, if we defined a struct `AveragedCollection` that has a field containing a vector of `i32` values. + +The struct can also have a field that contains the average of te vlaues in the vector, meaning the average doesn't have to be computed on demand whenever anyone needs it. + +In other words, `AveragedCollection` will cache the calculated average of the values in the vector. + +Meaning the average doesn't have to be computed on demand whenever it is needed. + +`AveragedCollection` will cache the calculated average for us. + +Here is the definition of the `AveragedCollection` struct + +```rust +pub struct AveragedCollection { + list: Vec, + average: f64, +} +``` diff --git a/hello_cargo/target/.rustc_info.json b/hello_cargo/target/.rustc_info.json index bff229b..f1a1e44 100644 --- a/hello_cargo/target/.rustc_info.json +++ b/hello_cargo/target/.rustc_info.json @@ -1 +1 @@ -{"rustc_fingerprint":953660965870803700,"outputs":{"17747080675513052775":{"success":true,"status":"","code":0,"stdout":"rustc 1.85.1 (4eb161250 2025-03-15)\nbinary: rustc\ncommit-hash: 4eb161250e340c8f48f66e2b929ef4a5bed7c181\ncommit-date: 2025-03-15\nhost: x86_64-unknown-linux-gnu\nrelease: 1.85.1\nLLVM version: 19.1.7\n","stderr":""},"2063776225603076451":{"success":true,"status":"","code":0,"stdout":"___\nlib___.rlib\nlib___.so\nlib___.so\nlib___.a\nlib___.so\n/home/brock/.rustup/toolchains/stable-x86_64-unknown-linux-gnu\noff\npacked\nunpacked\n___\ndebug_assertions\npanic=\"unwind\"\nproc_macro\ntarget_abi=\"\"\ntarget_arch=\"x86_64\"\ntarget_endian=\"little\"\ntarget_env=\"gnu\"\ntarget_family=\"unix\"\ntarget_feature=\"fxsr\"\ntarget_feature=\"sse\"\ntarget_feature=\"sse2\"\ntarget_has_atomic=\"16\"\ntarget_has_atomic=\"32\"\ntarget_has_atomic=\"64\"\ntarget_has_atomic=\"8\"\ntarget_has_atomic=\"ptr\"\ntarget_os=\"linux\"\ntarget_pointer_width=\"64\"\ntarget_vendor=\"unknown\"\nunix\n","stderr":""},"13331785392996375709":{"success":true,"status":"","code":0,"stdout":"___\nlib___.rlib\nlib___.so\nlib___.so\nlib___.a\nlib___.so\n/home/brock/.rustup/toolchains/stable-x86_64-unknown-linux-gnu\noff\npacked\nunpacked\n___\ndebug_assertions\npanic=\"unwind\"\nproc_macro\ntarget_abi=\"\"\ntarget_arch=\"x86_64\"\ntarget_endian=\"little\"\ntarget_env=\"gnu\"\ntarget_family=\"unix\"\ntarget_feature=\"fxsr\"\ntarget_feature=\"sse\"\ntarget_feature=\"sse2\"\ntarget_has_atomic=\"16\"\ntarget_has_atomic=\"32\"\ntarget_has_atomic=\"64\"\ntarget_has_atomic=\"8\"\ntarget_has_atomic=\"ptr\"\ntarget_os=\"linux\"\ntarget_pointer_width=\"64\"\ntarget_vendor=\"unknown\"\nunix\n","stderr":""}},"successes":{}} \ No newline at end of file +{"rustc_fingerprint":953660965870803700,"outputs":{"17747080675513052775":{"success":true,"status":"","code":0,"stdout":"rustc 1.85.1 (4eb161250 2025-03-15)\nbinary: rustc\ncommit-hash: 4eb161250e340c8f48f66e2b929ef4a5bed7c181\ncommit-date: 2025-03-15\nhost: x86_64-unknown-linux-gnu\nrelease: 1.85.1\nLLVM version: 19.1.7\n","stderr":""},"13331785392996375709":{"success":true,"status":"","code":0,"stdout":"___\nlib___.rlib\nlib___.so\nlib___.so\nlib___.a\nlib___.so\n/home/brock/.rustup/toolchains/stable-x86_64-unknown-linux-gnu\noff\npacked\nunpacked\n___\ndebug_assertions\npanic=\"unwind\"\nproc_macro\ntarget_abi=\"\"\ntarget_arch=\"x86_64\"\ntarget_endian=\"little\"\ntarget_env=\"gnu\"\ntarget_family=\"unix\"\ntarget_feature=\"fxsr\"\ntarget_feature=\"sse\"\ntarget_feature=\"sse2\"\ntarget_has_atomic=\"16\"\ntarget_has_atomic=\"32\"\ntarget_has_atomic=\"64\"\ntarget_has_atomic=\"8\"\ntarget_has_atomic=\"ptr\"\ntarget_os=\"linux\"\ntarget_pointer_width=\"64\"\ntarget_vendor=\"unknown\"\nunix\n","stderr":""},"2063776225603076451":{"success":true,"status":"","code":0,"stdout":"___\nlib___.rlib\nlib___.so\nlib___.so\nlib___.a\nlib___.so\n/home/brock/.rustup/toolchains/stable-x86_64-unknown-linux-gnu\noff\npacked\nunpacked\n___\ndebug_assertions\npanic=\"unwind\"\nproc_macro\ntarget_abi=\"\"\ntarget_arch=\"x86_64\"\ntarget_endian=\"little\"\ntarget_env=\"gnu\"\ntarget_family=\"unix\"\ntarget_feature=\"fxsr\"\ntarget_feature=\"sse\"\ntarget_feature=\"sse2\"\ntarget_has_atomic=\"16\"\ntarget_has_atomic=\"32\"\ntarget_has_atomic=\"64\"\ntarget_has_atomic=\"8\"\ntarget_has_atomic=\"ptr\"\ntarget_os=\"linux\"\ntarget_pointer_width=\"64\"\ntarget_vendor=\"unknown\"\nunix\n","stderr":""}},"successes":{}} \ No newline at end of file