در حوزه Abstraction، در مورد یک case کلی از یک context مشخص صحبت می شود و به جزئیات پرداخته نمی شود. زمانی که ما انتزاعی فکر می کنیم، بر روی اشتراک ها صحبت می کنیم و به جزئیات اشاره ای نمی کنیم. بنابراین یک abstraction مناسب در طراحی نرم افزار، نیاز به این دارد که ما تا حد خوبی مساله را بشناسیم و بتوانیم commonality یا شباهت ها و variability یا تفاوت ها را شناسایی کنیم.
موضوع commonality در طراحی نرم افزار، در اشکال متفاوتی دیده می شود. برای مثال یک method یا procedure، به عنوان یک منطق مشابه در حوزه commonality است و آرگومان ها، variabilityهای آن هستند.
در design patternها نیز یک مشکل مطرح می شود و در حوزه آن مشکل commonality و variabilityها شناسایی می شوند. برای مثال در strategy، ورودی ها مشابه و الگوریتم پیاده سازی متفاوت است. یکی از principleهای اصول طراحی، موضوع Variation Isolation است و در عمده patternها دیده می شود.
موضوع Classification یا طبقه بندی، در طراحی نرم افزار بسیار مهم است. classification به عنوان یک نظم دهنده دانش تعریف می شود. برای مثال در تعریف یک سیستم حیات، می توانیم یک classification در قالب خزندگان، پرندگان، پستانداران و غیره ارائه دهیم. بسته به این که در مورد چه موضوعی می خواهیم صحبت کنیم، می توانیم به اشکال دیگری این دانش را طبقه بندی کنیم.
شناسایی شباهت ها به ما در پیدا کردن abstractهای کلیدی و مکانیزم های پیرامون آن، کمک می کند. برای مثال وقتی یک entity به نام Customer در پروژه خود ایجاد می کنیم، یک دسته از آدم ها را به عنوان شباهت شناسایی کردیم که یک سرویس را از ما دریافت می کنند.
در classification از طریق discovery یا شناسایی، به انتزاع های کلیدی و مکانیزم هایی می رسیم که زبان domain ما را شکل می دهند. و از طریق invention یا ابداع، بین abstractionها مکانیزم ایجاد می کنیم و مشخص می کنیم که objectها چطور می توانند آن را model کنند. بنابراین discovery و invention، در حوزه classification تعریف می شوند.