GRASP (General Responsibility Assignment Software Principles) outlines software design patterns and principles for assigning responsibilities to classes, including the Expert, Creator, Low Coupling, High Cohesion, Controller, Polymorphism, Pure Fabrication, Indirection, and Controlled Variation principles. The principles provide guidance on minimizing dependencies between classes, reducing impacts of design changes, handling events and requests, acting differently based on object type, and structuring variations to avoid brittle designs. Following these principles can help create reusable, well-maintained code by properly assigning responsibilities in the software design.