An educational personal project aiming to create an inventory management system mock-up similar to a video game inventory, utilizing plugable modules that can change the storage schema at runtime. The system is inspired by the "sylladex" in the webcomic Homestuck by Andrew Hussie. The sylladex in the webcomic being a story mechanic that explained how characters stored their belongings in unique and different ways.
This project's purpose is to help serve as an educational environement to learn and get hands on experience with the many facets of software development.
specifically:
- the various features and components of the Java language, along with what the good practices are
- expirementing with design patterns and implementing them
- promote design intuition by simulating and modeling real world storage structures as complex data structures
- learn various tools such as version control, test suites, and project build tools
However, functionally, this project in actual usage is more of a novel toy program as it is designed to appeal to readers of Andrew Hussie's "Homestuck" webcomic through simulating a referenced story mechanic. Akin to bringing a unqiue story mechanic into a real world interactive mock-up.
- The
Sylladexuses three systems to enable dynamic management of items.- The inventory system is composed of
Cards where aCardcan hold a supplied item the user "gives".- The
Sylladexholds a 'master deck' that contains the current inventory state in a standardized format ofCards - The
ModusBufferholds a reference to the 'master deck', which can be modify the 'master deck' but not replace it - A
Modusdescribes a storage schema and holds a unique data structure ofCards which it can save/load to theModusBufferafter converting it from a standardized format
- The
- The interfacing system is composed of a
ModusManagerthat has a list ofMetadatamodels and aModusBuffermodel- A
Metadatamodel supplies information about a givenModusunit and enablesModusManagerto map user-input to lambda expressions theModussupplies as functionality - A
ModusBuffermodel supplies all the required information aModusunit requires, utilizing dependency inversion
- A
- The management system is composed of
Moduss that determine how items can be stored and retrieved from aCardby building complex and abstract data structed composed ofCards unique to that individualModus- specificially, each
Modusimplements a unique way of interacting with the data structure that is unique to that modus - A
Moduscan be loaded and swapped out for a differentModusunit with full compatibility thanks toMetadata - The
Modusinterface andMetadatamodel enables the inventory to be used by eachModuswithout needing to reset- each unit must be able to convert it's unique storage abstraction into a standardized simple "deck" of
Cards and back when passed out of the unit and into the unit respectively - each unit must only be allowed to manipulate the data held by
ModusBufferacting as a buffer of standardized required data for theModusunits that they can access when swapped out, much like a port
- each unit must be able to convert it's unique storage abstraction into a standardized simple "deck" of
- specificially, each
- The inventory system is composed of
layer structure: view | Sylladex | ModusManager | (ModusBuffer & Metadata) | Modus
- The Interactive Sylladex works by providing a
GUIfor a user to submit commands similar to a terminal - a command details some operation to apply to the inventory system
- a
Sylladexbroadcasts submitted commands and manages the low abstraction data as a "master deck" - a
ModusManagerprovides interfacing with modularModusunits - many
Modusunits provide implementation for how to interact with a unique inventory storage structure - a
ModusBufferprovides data state that aModusunit uses, enabling easy modular swapping ofModusunits
Requires a Java 8 SDK.
The project can be compiled, tested, and packaged by importing the project using the included Maven pom.xml. An executable jar file can be created by using the package lifecycle goal.
01/30/2019 Milestone Pull
- The project is now at the second iteration of a working and demo-able prototype
- class structure now uses a layered design with dependency inversion to form a one way dependency tree.
- the layers goes from
Sylladex(lowest level) toModus(high level), abstracting with models Sylladex(controller) depends onModusManager(container) to interface with theModusModusManagerdepends onModusBuffer(model) andModus(sub-controller)Modusdepends onModusBuffer,Metadata(model), andCard(model)
- the layers goes from
- the layered design also uses generics, data encapsulation, and polymorphism to achieve modularity
- the
ModusManageruses theModusinterface in conjunction with lambdas in aCommandMapto dynamically execute functionality from the currently connectedModus - the
ModusBufferencapsulates data and provides required data to theModuswhile also buffering this wrapped data between any swappedModusobjects. - the
Sylladexprovides all required information in wrapped objects to enable soft linkage of data and allow theSylladexto hold data manipulated by theModuswithout having to collect it, utilizing the 'double pointer/reference' pattern design used in the C language.
- the
- refactored a lot of code to be more modular, reducing redundancies, and streamlining complexities
- utilized more SOLID and GRASP principles of 'OO design' within redesigned structure
- broke down several classes and methods that were becoming monolithic to improve modularity, maintainability, and testability
- utilized 'decomposition of responsibility' and 'data encapsulation' to make methods of classes more testable
- focus is more on interfacing with what is promised and less on implemented procedure
- utilized strong
exceptionhandling practices to make debugging information more expressive and easier to find- custom exceptions associated with certain levels of severity and origin for precise handling and communication
04/21/2018 Milestone Commit
- GUI can be launched with proper interactions with the
PentaFile Modusunit.