资源说明:Single Class Object Model
-------------------------------------------------------------- SCOM: Single Class Object Model ------------------------------ ----- Programmer's Guide ----- ------------------------------ www.terimakasi.com 10 june 2012 - 01:32 https://github.com/terimakasi/scom -------------------------------------------------------------- Table of Contents ----------------- 1. Introduction 2. Getting Started 3. Interactive Shell 4. Guidelines 5. License 6. Samples 7. To Do A. Appendix 1. Introduction --------------- SCOM is a exercise in style with a 'constructivist' motivation. The purpose is to design an Model Objet provided as a Single class (!!), called 'It' (core/root class). SCOM paradigm is founded on top of 3 'Design Intents': a. Runtime Semantic Network --------------------------- SCOM provides an easy and straightforward way to creatr 'semantic networks' at runtime (much like XML DOM) The atoms of SCOM semantic networks are RDF-like triples (Subject --Predicate--> Object). In SCOM, all 3 parts of the triple are 'It' instances - 'Subject': is an It instance - 'Predicate': is an unidirectional relation, it is called a 'facet' - 'Object': is called a 'facet value' b. Self evaluation instances ---------------------------- Inspired by functional programming (especially 'Lisp'). Thus Application behavior is implemented: - by overriding 'evaluate' method in subclasses of 'It' - once a subclass implements a method, it could then be added to an It instance as a 'behavioral facet' c. Native Adaptative Object Model --------------------------------- SCOM supports the AOM paradigm (Adaptative Object Model), where business domain classes are not static like 'regular OOP languages' (e.g: Java, C#/C++) but instead dynamically created at runtime (much like classes described by Semantic Web Ontology language: 'Owl') like pure Object languages (e.g: Smalltalk) Note: SCOM is 'null safe', this is implemented by a native singleton ('NIL') 2. Getting Started ------------------ a. Create an It instance by calling 'New()' factory method: It item = It.New(); b. Then add a 'VALUE' facets (a facet is like similar an attributes or property): e.g: item.putFacet(VALUE, New("Hello World !")); c. Then you can use 'Print()' helper method to show instance's value and facets: e.g: Print(item); d. Now test this code by running 'HelloWorld.java' (in scom.tutorials.helloworld sample), the output should be: **** SCOM: HelloWorld sample **** object1 name: object1 value: Hello World ! class: Object Explanation: here we see that we have created an It instance which is also an instance of 'Object' class in SCOM native AOM (Adaptative Object Model), this instance has 3 facets: - value = 'Hello World !' - class = 'Object' - name = 'object1' e. Now we may uncomment the following line (in 'HelloWorld.java'): //Print(item, WITH_UNLIMITED_DEPTH); This will print facets of item's facets recursively: object1: value: Hello World ! class: Object Object: class: Class Class: superclass: Class count: 3 new: Class class: Class name: Class count: 1 value: NIL superclass: Object new: Object name: Object name: object1 Explanation: here we see that 'class' facet which is 'Object' has also its own facets: note: 'class' of 'Object' is 'Class' which is the metaclass of SCOM native AOM (Adaptative Object Model) 'Object' has also a 'superclass' (which is itself) Object: class: Class Class: superclass: Class count: 3 new: Class class: Class name: Class count: 1 value: NIL superclass: Object new: Object name: Object 3. Interactive Shell -------------------- SCOM embeds an Interactive Command Shell. This Shell allows to create instances and classes as well as 'custom commands' (instances of native 'Command' class) which are written in Javascript. To start the SHELL, use the following code: SHELL.evaluate(); This will display a '>' prompt on standard console output, then you may input 'help' command, which prints the following: print 'variable': prints value of variable (e.g: print Object) eval 'variable': evaluates 'variable' set 'variable' 'value': sets value of 'variable' edit 'variable': edit value of 'variable' in default editor new: creates an 'Object' instance new 'class': creates an instance of 'class' (eg: new Integer) list 'class': lists all instances of 'class' (eg: list Command) ?, h, help: prints this text q, quit or exit: exits this Shell Now let's start by listing all AOM classes: > list Class This will print: Command String Class Integer Object Then let's create our first custom command: > new Command command1 class: Command name: command1 script(): Let's list the instances of 'Command' class: > list Command command1 Now let's edit command1's script: > edit command1 This will open Notepad to allow edition of command1's script, input the following (please notice that strings are delimited by simple quote '): print('hello'); Now exit Notepad, this will print: command1 class: Command name: command1 script(): print("hello"); Now let's run our custom command: > command1 hello You may have the same output with 'eval' command (because all It instances are able to self evaluate): > eval command1 hello Last, let's see what happens if we input dummy Javascript code: > edit command1 Now enter the following in Notepad: dummy javascript code Let's see what happens when running our modified script: > command1 sun.org.mozilla.javascript.internal.EvaluatorException: il manque ';' avant une instruction (#1) in at line number 1 4. Guidelines --------------- All samples/apps built on top of SCOM must comply to the following rules: - All implementation classes (not taking into account unit/functional tests) must be subclasses of 'It' class - subclasses should not add instance methods to the API (else it will break SCOM paradigm), thus are only allowed to override: - 'evaluate()' and optionally 'toString()' - constructor: in fact it's a requirement, due to the instanciation of 'It' through a static factory method ('New()') note: SCOM is 'null safe', this is implemented by a native singleton ('NIL') which requires a factory method - subclasses should not add static/class methods - subclasses must override 'BASENAME' and 'CLASS_NAME' static fields Native Object Model: 'ENVIRONMENT' ---------------------------------- 'It' core class provides a native Object Model ('ENVIRONMENT') which is a Singleton populated by 'initEnvironment()' note: application may extend 'ENVIRONMENT' by overriding 'initEnvironment()' (see: 'ItLisp' in com.samples.lang.lisp) in that case the overriding 'initEnvironment()' must start by calling the parent class's initEnvironment(): protected void initEnvironment() { super.initEnvironment(); ... } 5. License --------------- This project is Open Source, under 'MIT license' (http://en.wikipedia.org/wiki/MIT_License) 6. Samples --------------- 7. To Do ------------------- - Readme.md or Readme.html ? - Automatic tests for regression check - Check if Windows/Unix to adapt (e.g: GetDesktop(),...): - Text editor (Notepad/vi) - Events / Hooks / Callbacks ? - Simulation of digital electronic components (e.g: logic gates) - Environment - Implement 'Plugins' for self-extensibility of 'environment' - SHELL could be a Plugin ! - TextFileWriter could be a Plugin ! - 'ERROR' variable which stores a message about last error - Shell: - if input ends with ';' then interpret it as Javascript - 'info' command in Shell: show version, instance count, plugins - 'exec' command - 'run' command (runs commands from a script file) - 'history' command - implement 'history' with up/down arrow keys - StringWriter and TextFileWriter as instances of 'Writer' (check in SHELL with 'list Writer') - Writer: - RDF / Owl / JSon - Database ! - D3/JS Graph drawing - Html (1 file per object/facet and links) - GraphViz format - Reader ! - e.g: read graph from Git or from url - Database ! - API consistency: - get rid of 'NewValue()' - getValue() and 'VALUE' facet should be only 2 different means to access value - AOM: - New Integer,...: .next should not be NIL - Allow to define name when instanciating a class (e.g: New(name, class_it)) - Chain Inheritance (attributes of superclasses recursively) - 'implement IInterface' cf. Java and allow implementations of multiple 'Interface' classes - Multiple values for _value of an It instance (getValue() = get(0) and add getValue(index) and valueCount) - Scope/Context for a facet (ex: localization of 'NAME') - Port to JVM ! A. Appendix ----------- A.1. Naming conventions ----------------------- - All static methods start with an Upper case letter then CamelCase (e.g: 'NewClass()') - private/protected methods have a additional '_' suffix (e.g: 'IsNIL_') - instance methods start with a Lower case letter then CamelCase (e.g: 'getKey()') - private methods have a additional '_' suffix - private instance fields start with a '_' prefix (e.g: _key); - Subclasses of It should be prefixed with 'It' (e.g: ItLisp) - those which are meant to be a 'method facet' of an It instance should be suffixed with 'F' (e.g: 'ItSuccessorF') - variables and methods parameters: - should use the 'underscore' naming convention (eg: 'class_it') - if they are 'It' instances, they should be suffixed with '_it' (eg: 'class_it') - variables which are used for typecasting (e.g: Object to String) should be suffixed with '_str' (eg: 'o_str')
本源码包内暂不包含可直接显示的源代码文件,请下载源码包。