A collection of open-source libraries for rapid application development in C#. This is the main development repository for work done by Ara3D.com.
The code is written in a simple and straightforward manner, and should serve mostly as its own documentation. Most functions are implemented as extension methods to improve discoverability.
Some of the code in this repository is available as NuGet packages.
To clone this repository the following command can be used:
git clone --recursive git://github.com/ara3d/ara3d.git
Note: there are a couple of libraries that will be missing. This is normal, because those libraries are in a private repository only available for Ara 3D employees. The solution should still build and work fine.
There are several submodules included with this repository.
- Domo - A state management library.
- Parakeet - A text parsing library.
- Bowerbird - A C# scripting library.
- Plato - A simple and efficient cross-platform programming language.
- Ara3D.Mathematics - A mathematical library.
- Ara3D.Geometry - A library of geometric algorithms and data structures.
- Ara3D.Collections - A library of LINQ inspired immutable containers.
- Ara3D.Utils - A library of miscellaneous utility algorithms and data structures.
Code hosted in this repsitory (excluding code in submodules) is divided into the following main sections:
src
- projects intended for use in production environmentslabs
- projects for experiments and investigationtests
- NUnit-based test projectsunity-projects
- Unity projectsdevops
- scripts and tools to simplify develolpment
The primary Ara 3D library design goals are roughly ordered as:
- Correctness
- Robustness
- Simplicity
- Portability
- Flexibility
- Discoverability
- Performance
This is not to say that performance is not important, but the other requirements must be addressed before performance can be considered. Performance is irrelevant if code is not correct, and well-written code is much easier to validate and optimize.
You will notice that a lot of care is placed into managing dependencies between the different libraries, and that 3rd party dependencies are very sparse. A perfect library
Most libraries are .NET Standard 2.0, so that they can be used in a wide range of scenarios such as for plug-ins.
There is no formal written-down coding style guidelines. Upon reading the code the established style should become apparent quickly.
In general we follow the Microsoft coding conventions for C#. We also use the JetBrains ReSharper plug-in and follow many of the default coding recommendations it makes.
Some rules of thumb:
- Prefer immutable data structures
- Prefer explicit APIs to implicit (e.g., minimize annotations)
- Keep interfaces small and single purpose
- Prefer easy to read code to micro-optimizations
- Default to making things public
- Don't repeat yourself
- Interfaces are a good thing, use them frequently
- Keep functions small, simple, and without side-effects
- When it makes sense use extension methods, they make code more generic, readable, and discoverable
- Support as many platforms as you can (e.g., default to using .NET Standard 2.0)
We welcome contributions. We expect the following:
- You have familiarized yourself with the structure and contents of existing libraries.
- You have validated that a contribution does not exist already.
- You follow the coding, naming, and documentation styles and conventions established in existing code.
- Code works well and is robust.
- You follow the design goals and programming principles.
Everything will be code-reviewed with rigour and kindness.
All code is licensed under the commercially friendly MIT License
Q: Some projects can't be found.
A : It is normal that projects in "private" can't be found. You also might not have recursively all submodules. See the top of the README.md.
Q: Why so many projects?
A : Small projects that do one thing and do it well (and are reliable, tested, and simple), are easier to understand, test, and reuse, making us more productive.
Q: Why use submodules?
A : Some of the work is of interest to the community as a standalone. This is the best way to help everyone get the code, and consume it independently.
Q: Where are the build tasks and properties?
Many of the build tasks and properties are controlled within the
Directory.Build.props
file whic is automatically included by all projects.