Domain-Specific Development with Visual Studio DSL Tools

51 downloads 58859 Views 278KB Size Report
Software Development Process Customization 9. Benefits 10. Languages 11. Textual DSLs 15 ... Custom Code for the Designers 73. Serialization Format of the ...
Domain-Specific Development with Visual Studio DSL Tools • • • •

Steve Cook Gareth Jones Stuart Kent Alan Cameron Wills

A Addison-Wesley Upper Saddle River, NJ e Boston • Indianapolis • San Francisco New York • Toronto 8 Montreal' • London • Munich • Paris Madrid • Capetown • Sydney • Tokyo • Singapore • Mexico City

Contents List of Figures xvii List of Tables xxv Foreword xxvii Preface xxix About the Authors xxxv Domain-Specific Development 1 Introduction 1 Domain-Specific Development 2 Examples 4 Software Defined Circuitry 8 Embedded Systems 9 Device Interfaces 9 Software Development Process Customization 9

Benefits 10 Languages 11 Textual DSLs 15 Graphical DSLs 20 Conventions for Representing Structure 21 Conventions for Representing Behavior 22

Aspects of Graphical DSLs 23 Notation 24 Domain Model 24 Generation 24

',

vii

viii

n Contents Serialization 25 Tool Integration 26 Putting It All Together 26

DSLs in Visual Studio 27 The Customization Pit 32 UML 34 Summary 40 Creating and Using DSLs 41

Introduction 41 Process: Incremental Development of DSLs 41 Generalizing an Application: Identify Variability, Discover DSLs 42 Top-Down and Bottom-Up 46 Developing the DSL: From Sketches to Domain Model 48 Domain Model and Presentation Are Separate 49 Refining the DSL 50 Driving the Frameworkfromthe DSL 51 Using the DSL 53 Evolving the DSLs 55 Interpretive Architectures 56

Creating a DSL in Visual Studio 57 Creating a DSL Authoring Solution in Visual Studio 57 Trying Out the DSL Solution 61 Defining the DSL 64 Generating the Code for the Designer 66 Adding to the DSL 67 Constraints 68 Customizing the Explorer Window 71 Customizing the Properties Window 72 Custom Code for the Designers 73 Serialization Format of the DSL File 73 Driving Applications from the DSL 74 Deployment 76

A Second DSL: The Project Definition DSL 77

Contents Architecture of the DSL Tools 78 The Generated Code 78 DSL Tools Architectural Layers 79 The Framework Assemblies 79 Content of the DSL Project 81 Content of the DslPackage Project 83 Summary 85 Domain Model Definition 87 Introduction 87 The Domain Model Designer 88 The In-Memory Store 89 Domain Classes 92 Domain Relationships 98 Embeddings 101 Multiplicity 104 References 105 Relationship Derivation 106 Generating a Designer with No Shapes 108 The Generated Code 109 Using the Generated Code 113 More about Domain Classes 115 DomainClassInfo 118 More about Domain Properties 119 Calculated Properties 121 DomainPropertylnfo 121 More on Domain Relationships and Roles 122 Accessing Links 124 More on Relationship Derivation 126 DomainRelationshipInfo and DomainRolelnfo 129 More about the Store 129 Looking Up Elements 129 Partitions 130 Rules 130 DomainModellnfo 130 Summary 131

'

a

i:IX

Contents

Presentation 133 Introduction 133 Graphical Notation—Overview 134 Diagram and Editor 137 Diagram 138 Editor 141 Designer 142 Custom Editor 142

Shapes 146 Kinds of Shapes 147 Shape Maps 154

Connectors 164 Connector Anatomy and Appearance 164 Connectors and Inheritance 165 Connector Maps 165 Advanced Connector Maps 167

Decorators 167 Kinds of Decorators 168 Positioning 169 Decorator Maps 170

Customizing the Graphical Notation in Code 173 Multiline Text Decorators 173



Variable Image Shape 174 Set a Background Picture 176 Set Custom Connection Points 177 Change Routing Style of Connectors 178

Explorer 180 Default Appearance 181 Changing the Window Icon and Label 183 Customizing the Appearance of Nodes 184 Hiding Nodes 186 Customizing the Explorer through Code 187 ,

Properties Window 188 Default Appearance of Properties Window 188 Categories, Names, and Descriptions 190

Contents Hiding Properties and Making Them Read-Only 192 Forwarding Properties 192 Customizing the Properties Window through Code 193

Summary 195 5

Creation, Deletion, and Update Behavior 197

Introduction 197 Element Creation 197 The Toolbox 198 Element Merge Directives 200 Custom Element Merge Directives 208 Re-Parenting with Element Merge Directives 211 Custom Element Tool Prototypes 212

Connection Builders 216 Multiple Source and Target Role Directives 217 Multiple Link Connect Directives 219 Custom Connection Builders 222

Element Deletion 229 Default Delete Propagation Rules 229 Controlling Delete Propagation 231 Customizing Delete Propagation 232

Summary 234 6

Serialization 237

Introduction 237 Saving and Loading Models and Diagrams Model XML File Format 239 Elements and Properties 242 Relationships 243 Relationship Derivation

245

Cross-Referencing 245 Using Guids as References 246 Using Qualified Names as References 248 , References to Links 249

Diagram XML File Format 251 Versioning and Migration 254

238



xi

xii



Contents The XML Schema 257 Customization 258 Modifying XML Element Names 259 Element Data 261 Implementing Your Own Serializer 264

Generated Serialization Code 264 Customized Serialization Code 271 Impact of Customization on the Schema 272

Summary 273 7

Constraints and Validation 275

Introduction 275 Choosing Hard or Soft Constraints? 277 Choices Made by the DSL Tools 280

Soft Constraints in the DSL Tools 280 Validation Methods 282 Enabling Validation 284 Invoking Validation 288 Custom Validation Categories 289 Inheriting Validation Behavior 292 Validation Output 292 Using Validation Outside the IDE 293 Validation Against External Data 294

Hard Constraints in the DSL Tools 295 Rules 296 Putting Together Hard and Soft Constraints 299 Summary 307 8

Generating Artifacts 309

Introduction 309 Artifact Generation Styles 311 Extensible Stylesheet Language Transformations 311 Making Use of the Domain-Specific API 314

',

A Template-Based Approach 319

Complex Relationships and Round-Tripping 321

Contents The Templatization Process 325 The First Cut Template 328 Generation-Specific Model Data 338 Starting to Build a Library 340 Syntax of a Text Template 341 Directives 341 Custom Directives 344 Control Block Types 346 Problems of Large-Scale, Real-World Artifact Generation 349 Advanced Customizations 351 Text Templating Architecture 352 Custom Hosting 354 Custom Directive Processor 357 Custom Orchestration 359 Summary 366 9

Deploying a DSL 369 Introduction 369 Files Needed to Install a Designer 370 Getting Started—Creating a Setup Project 373 Setup Project Contents 376 Customizing Setup 377 Customizing InstallerDefinition.dslsetup 377 Customizing settings.ini 377 Customizing Strings.wxl 378 Customizing Product.ico 378 The .dslsetup Format 378 380 382 382 383 384 384 384 385

'•



xiii

xiv

D

m

Contents

Refreshing the Installation Files 387 Package Load Key 388 Deploying Text Templates for Code Generation 390 Creating a Project Templatefromthe Debugging Project 390 Using a Text Template Include File 392 Including Text Templates in the VS Item Template 393

Summary 396 10 Advanced DSL Customization 397

Introduction 397 Tools for Customization 397 Partial Classes 397 Double Derived—The Generation Gap 398 Custom Constructors 399 Customization Switches 399 Custom Overrides 401

Responding to Changes 402 Property Handlers "On Value Changed/Changing" 402 Calculated Domain Properties 404 Custom Storage Domain Properties 405 Notify Value Change 407 Propagating ChangefromModel to Shape: OnAssociatedPropertyChanged 408 Rules 412 Store Events 417 .NET Event Handlers 419 Event Overrides 420 Bounds Rules 420 Summary of Change Propagation and Constraint Techniques 424

DSL Shell Architecture 426 How to Add a Menu Command 429 Add a Command Id for Each Command 430 Increment Menu Resource Index 430 '• Add Commands to Command Set 431 Define the Command Handlers 432 Good Practices for Command Handlers 434

Contents Build and Run 435 Providing Handlers for Standard Commands 435

Building the DSL Diagram into Another Interface 435 Implementing Copy and Paste 437 The Copy Method 437 The Paste Method 438 Registering the Menu Handlers 440

Shape Containers 442 Child Shapes 442 A DSL Using Nested Child Shapes 443 Shape Containment Using Rules 446

Summary 453 11 Designing a DSL 455 Introduction 455 Identifying Variability 456 Bottom-Up or Top-Down? 457 Feature Trees 458 Feature Trees and DSLs 459

Developing the Domain Model 460 Sketch Domain Snapshots 460 Domain Model from Snapshots 464

Developing the Notation 468 Project Definition Notation 470 Issue State Notation 471 Familiar Notations 474

Defining Validation Constraints 475 Internal Consistency 476 Consistency with External Data and Models 478

Developing and Evolving the Framework 479 Generation versus Interpretation 479 Evolving a Generic Framework 482 Driving a Frameworkfromthe DSL 483 '•

Testing 484 Validation Constraints 486 Generator Templates 488

m xv

xvi

m

Contents Generated Code 488 Rules 489 Language Definition 489 Evolving a DSL 489 What Makes a Good DSL? 491 Appropriate Notation: An Example with Regular Expressions 493 Candidate Notations 495 Graphs Are Not Syntax Trees 498 Summary 498 Conclusion 499 Index 503

Suggest Documents