Hi

We want to raise a strong warning against the extension of the use of asClass and friends. asClass should not be used in Pharo distribution. I will propose to deprecate it.

We are working on dependency analysis, module system, remote debugging and asClass introduces
lose class references and many related problems.

I would like to remove this behavior because it is clear that it will just grow up and lead to deadcode and ugly dependencies.

First, most of the time you can avoid to query Smalltalk globals at: and that BY CONSTRUCTION a software system should be built and it should define its own customization.


Second, at least use self class environment at: #foo

Why is it much much much better? because it does not rely on String class resolution and as such is much more modular. You do not want to have the resolution of a symbol related to the place where String is defined but on where your code is actually.

Imagine that tomorrow your code is in its own module. Then you want to know from your code point of you
if a binding exist not from the one of environment in which String is.




here are some examples:

==============================
quadrangleClass
    ^ 'QuadrangleForTesting' asClass

Strange it simply breaks. Of course it broke the smallLint rule.

==============================
Metacello should better define OSProcess as a dependent.Because it is not clear what will happen
if if not there?

extractRepositoryFrom: zipFile to: directory
    "unzip <zipFile> into <directory>"

    | out err proc errorMessage |
    out := FileStream forceNewFileNamed: '/tmp/zip.out'.
    err := FileStream forceNewFileNamed: '/tmp/zip.err'.
    errorMessage := ''.
    [
    proc := #OSProcess asClass thisOSProcess
        forkJob: '/usr/bin/unzip'
        arguments:
            {'-u'.
            zipFile.
            '-d'.
            directory}
        environment: nil
        descriptors: (Array with: nil with: out with: err).

==================

I do not get why we need this funky logic.

openInBrickWindowLabeled: aLabel

    #GLMSystemWindowBrick asClassIfAbsent: [
        ^ self asMorph openInWindow ].

    ^ #GLMSystemWindowBrick asClass new
        label: aLabel;
        color: Color transparent;
        addBrickBack: (
            GLMBrick new
                vSpaceFill


window
    "Answer the receiver's window."
    #GLMWindowBrick asClassIfAbsent: [
        ^ self ownerThatIsA: SystemWindow ].

    ^ (self ownerThatIsA: #GLMWindowBrick asClass)
        ifNil: [ self ownerThatIsA: SystemWindow ]



sendUsageData: aBoolean
    | settingsClass |
settingsClass := #GTSpotterEventRecorderSettings asClassIfAbsent: [ ^ self ].
    ^ settingsClass sendUsageData: aBoolean


sendUsageData
    | settingsClass |
settingsClass := #GTSpotterEventRecorderSettings asClassIfAbsent: [ ^ false ].
    ^ settingsClass sendUsageData


Reply via email to