-
Notifications
You must be signed in to change notification settings - Fork 0
System Design
The system is built using a layered architecture consisting of Structures, Services, and Interfaces.
Structures correspond to the domain or data layer in Domain-Driven Design (DDD). They are responsible for holding the application's state and entities, as well as modeling real-world objects, such as domain objects like AssignmentDetails.
Services represent the service layer, containing the business logic of the application. This includes components like the TestRunner, which runs tests for assignments.
Interfaces serve as the abstraction layer, defining abstract contracts that enable loose coupling and provide necessary functionality. For example, the TestRunner interface outlines the required behaviors for any test runner implementation.
Submission Extraction
The SubmissionExtractor class handles the extraction of submissions from the uploaded submission.zip file. The submissions are extracted and organized into directories, each corresponding to an individual student's submission..
Submission Testing
The AssignmentTestRunner class runs predefined test cases on each submission. These tests evaluate the correctness and behavior of the code based on the assignment specifications.
Submission Grading
Results from TestRunner are passed to GradeFactory to assign grades, which are stored in AssignmentGrade with feedback. StudentDetails and AssignmentGrade are combined into AssignmentDetails.
Feedback Generation
The PDFGenerator class creates a detailed report for each submission using the AssignmentDetails. This report includes the overall score obtained as well as detailed feedback on passed and failed test cases.
This software system was developed using an iterative approach, organized into distinct phases: Development, Testing, and Refactoring.
- Development phases focuse on introducing new functionality through extensions.
- Testing phases ensure the correctness and performance of pre-existing functionality.
- Refactoring phases aim to improve the modularity and extensibility of the codebase.
Development and testing phases can occur in parallel, as long as interfaces are agreed upon and adhered to. Refactoring is typically done concurrently or one at a time, with careful attention to the main branch.
For more details on this workflow, refer to our internal docs. The JavaDocs provide additional in depth information on each class and interface in the system.