Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Program Design - Package by Feature vs. Layer or Both?

I am in the design stage of a web application that allows users to create requests of work and the workers to put time against those requests. The application will also have reporting capabilities for supervisors to get daily totals, reports, and account for time spent, "cost allocation".

Applications I've worked on in the past have been designed using the package by layer approach. I'm thinking it would be more efficient to use a package by feature design and I have a question about this design.

What I am currently thinking for the packages by feature:

  1. Requests - CRUD the requests, assign then, add invoice numbers, etc...
  2. Work Time - CRUD daily time for users against requests, holiday, training, or meetings
  3. Cost Allocation - create reports, accounting things that accountants want ...

The front-end will be Tomcat server and JSP. And, the back-end will be an Oracle database with EclipseLink doing the persistence.

My question:

In my understanding of package by feature, the entities and DAOs would go into the package associated with them. Spreading out the persistence layer across several packages. Leaving packages to call entities from other packages. With all of the overlap is this really functional? There would be no isolation between the packages. What are the pros and cons to using package by feature? Would it be good design to go with an additional persistence layer? Or, do I have the understanding of this totally wrong?

like image 584
Miller Avatar asked Jun 07 '11 03:06

Miller


People also ask

What is packaging by layer?

In this project structure, classes are placed in the architectural layer package they belong to. This method causes low cohesion within packages because packages contain classes that are not closely related to each other.

What is package by feature?

Package-by-feature uses packages to reflect the feature set. It tries to place all items related to a single feature (and only that feature) into a single directory/package. This results in packages with high cohesion and high modularity, and with minimal coupling between packages.

What is package structure?

A typical structure may include a top-level package for all requirements in the model. Each nested package within this package may contain requirements from different specifications, such as the system specification, element specifications, and component specifications.

What is a package in programming?

A package is a namespace that organizes a set of related classes and interfaces. Conceptually you can think of packages as being similar to different folders on your computer. You might keep HTML pages in one folder, images in another, and scripts or applications in yet another.


2 Answers

5 years later...

(Suspenseful music in the background)

Imagine this ridiculous situation:

Managers company, Programmers company, Human Resources company and Marketing company, where the Programmers company will only have programmers and no managers, marketeers or human resources;

We wouldn't want to split co-workers by their profession instead of organizing (self-coordinating) teams, or would we?

Packaging stuff together by what it is, and not by what it does, will only make you jump 10 times to the place you are looking for.

Package by feature, not layers.

Now doesn't that just look sexy? By looking at the structure, you can already tell what the app is all about. Not satisfied? Read full article.

like image 125
joshuamabina Avatar answered Sep 28 '22 05:09

joshuamabina


I would suggest to start package things based on business entities. And in there you can divide things based on layers.

With all of the overlap is this really functional?

I am practising it for long. I don't see any major issues with this approach. You must find out what to decouple and how much it should be decoupled. For example, calling a persistent method of orders from a customer package using the API provided by orders is pretty fine for me.

What are the pros and cons to using package by feature?

I find it more simple, straight, understandable and easy to work with than strict layer oriented packaging. It benefits when you want to split and distribute things to different places.

Would it be good design to go with an additional persistence layer?

Look at this SO thread, I found JPA, or alike, don't encourage DAO pattern.

Further Reading

  • Generic Repository and DDD
like image 25
Adeel Ansari Avatar answered Sep 28 '22 06:09

Adeel Ansari