Re: Builder: Tiny Utility Library to Add a Builder API to Classes

2023-01-06 Thread thebluepandabear via Digitalmars-d-announce

On Friday, 6 January 2023 at 12:54:07 UTC, Vijay Nayar wrote:
On Friday, 6 January 2023 at 09:26:51 UTC, thebluepandabear 
wrote:

  .isActive(true)
  .build();
```


Good 

how would I extend the builder methods?


The builder methods are automatically generated and go up the 
inheritance chain to capture all the fields in your class. (I 
assume that you are referring to inheritance when you say 
"extend"?)


Here is one of the unit-tests demonstrating this:

```
class A2 {
  int a;
  string b;
}

class B2 : A2 {
  int c;

  mixin AddBuilder!(typeof(this));
}

/// All inherited fields should be available from the builder.
unittest {
  B2 b2 = B2.builder()
  .a(3)
  .b("ham")
  .c(4)
  .build();

  assert(b2.a == 3);
  assert(b2.b == "ham");
  assert(b2.c == 4);
}
```


I meant what if I want some extra behavior for the setter method 
other than just assigning a value to the field. E.g. if I set a 
password field, I might want to validate that it's valid.


Re: Builder: Tiny Utility Library to Add a Builder API to Classes

2023-01-06 Thread Vijay Nayar via Digitalmars-d-announce

On Friday, 6 January 2023 at 09:26:51 UTC, thebluepandabear wrote:

  .isActive(true)
  .build();
```


Good 

how would I extend the builder methods?


The builder methods are automatically generated and go up the 
inheritance chain to capture all the fields in your class. (I 
assume that you are referring to inheritance when you say 
"extend"?)


Here is one of the unit-tests demonstrating this:

```
class A2 {
  int a;
  string b;
}

class B2 : A2 {
  int c;

  mixin AddBuilder!(typeof(this));
}

/// All inherited fields should be available from the builder.
unittest {
  B2 b2 = B2.builder()
  .a(3)
  .b("ham")
  .c(4)
  .build();

  assert(b2.a == 3);
  assert(b2.b == "ham");
  assert(b2.c == 4);
}
```


Re: Builder: Tiny Utility Library to Add a Builder API to Classes

2023-01-06 Thread thebluepandabear via Digitalmars-d-announce

  .isActive(true)
  .build();
```


Good 

how would I extend the builder methods?


Re: Builder: Tiny Utility Library to Add a Builder API to Classes

2023-01-06 Thread Vijay Nayar via Digitalmars-d-announce
On Thursday, 5 January 2023 at 23:31:36 UTC, Vladimir Marchevsky 
wrote:

On Thursday, 5 January 2023 at 21:48:40 UTC, Vijay Nayar wrote:


2. Using a constructor with many arguments.
```
A a = new A("Bob", 20, false, true);
```

This approach can construct arguments inline, such as during a 
function call, however, the arguments are not labeled, making 
it easy to get the order wrong or for the meaning to be 
unclear.


Hopefully we'll finally have named arguments. Considering they 
were accepted to language more than two years ago - maybe in 
the next century...


Named arguments would definitely obviate this tool, but in the 
meanwhile, this tool basically lets you achieve the same 
objectives in terms of single-expression construction and clearly 
labeled arguments. I guess one extra advantage of the `builder` 
library is that you also don't have to bother writing a 
constructor at all and can just use the default one.


Re: Builder: Tiny Utility Library to Add a Builder API to Classes

2023-01-05 Thread Vladimir Marchevsky via Digitalmars-d-announce

On Thursday, 5 January 2023 at 21:48:40 UTC, Vijay Nayar wrote:


2. Using a constructor with many arguments.
```
A a = new A("Bob", 20, false, true);
```

This approach can construct arguments inline, such as during a 
function call, however, the arguments are not labeled, making 
it easy to get the order wrong or for the meaning to be unclear.


Hopefully we'll finally have named arguments. Considering they 
were accepted to language more than two years ago - maybe in the 
next century...